代码如下:
class spinlock_mutex
{
std::atomic_flag flag;
public:
spinlock_mutex():
flag(ATOMIC_FLAG_INIT)
{}
void lock()
{
while(flag.test_and_set(std::memory_order_acquire);
}
void unlock()
{
while(flag.clear(std::memory_order_release);
}
};
代码解释:
这段代码实现了一个简单的自旋锁(spinlock),其中用到了 std::atomic_flag,它是 C++ 提供的最轻量级的原子类型之一,专门用于实现自旋锁等低级同步原语。
成员变量:std::atomic_flag flag
-
atomic_flag是一个布尔值原子变量:-
只能设置为
true(set)或清除为false(clear) -
初始值必须通过
ATOMIC_FLAG_INIT初始化 -
不支持直接赋值操作(如
flag = true是非法的)
-
lock() 方法解释:
-
flag.test_and_set()是原子操作,行为如下:-
返回当前值(true/false)
-
并 设置为 true
-
-
所以如果当前是
false(表示“未上锁”),第一次调用就会:-
返回
false -
并将其置为
true -
从而跳出
while循环,成功加锁
-
-
如果当前已经是
true(“已经上锁”),就会不断自旋等待。 -
std::memory_order_acquire是内存序,保证在这之后的所有内存读写不会被 CPU 或编译器提前执行(即加锁后的操作不会重排序到锁前)。
unlock() 方法解释:
-
clear()将标志位重置为false,即释放锁 -
std::memory_order_release:保证在释放锁之前的所有写操作对其他线程可见,不会被推迟到锁释放之后。
自旋锁的特点
-
优点:
-
实现简单,性能极高(用于非常短时间的锁)
-
适用于多核 CPU 上线程竞争不激烈的情况
-
-
缺点:
-
自旋会占用 CPU 资源(线程一直在忙等)
-
不适合长时间持锁场景
-
总结用法示例:
spinlock_mutex mtx;
void thread_func()
{
mtx.lock();
//临界区
mtx.unlock();
}
893

被折叠的 条评论
为什么被折叠?



