c++自旋锁的调用示例
时间: 2023-09-28 14:12:24 浏览: 95
下面是一个使用C++自旋锁的示例代码:
```c++
#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
class SpinLock {
private:
atomic_flag lock = ATOMIC_FLAG_INIT; // 初始化为未锁定状态
public:
void lock() {
while (lock.test_and_set(memory_order_acquire)); // 自旋等待锁的释放
}
void unlock() {
lock.clear(memory_order_release); // 释放锁
}
};
int counter = 0;
SpinLock spinLock;
void increment() {
spinLock.lock();
counter++;
spinLock.unlock();
}
int main() {
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
cout << "Counter value: " << counter << endl;
return 0;
}
```
在这个示例中,我们定义了一个名为`SpinLock`的类来实现自旋锁。`lock()`方法使用`while`循环来自旋等待锁的释放。`test_and_set()`方法会将锁的状态从未锁定状态改为锁定状态,并返回旧值,如果旧值为真,则表示锁已被其他线程占用,需要继续等待。`unlock()`方法则将锁的状态改回未锁定状态,以释放锁。
在`main()`函数中,我们创建了两个线程`t1`和`t2`,它们都会调用`increment()`函数来增加`counter`变量的值。在`increment()`函数中,我们使用`SpinLock`类来保护`counter`变量的访问,以避免并发访问导致的数据竞争问题。
最后,我们输出`counter`变量的值,以验证自旋锁的正确性。
阅读全文