• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-09-18 23:24 Aet 隐藏边栏 |   抢沙发  9 
文章评分 2 次,平均分 5.0

自旋锁

  1. ATOMIC_FLAG_INIT进行了flag的初始化
    1. 它确保了flag的初始状态是清除(或说“未设置”)状态
  2. lock调用了test_and_set方法来试图获取锁
    1. test_and_set会检查flag的当前值:如果flag是清除状态,则设置它并返回false;如果flag是已设置状态,则返回true
    2. 当某线程首次尝试获取锁时,flag会被设置,而其它的线程将进入自旋状态,直到锁被释放
  3. unlock用于释放锁
    1. flag.clear(std::memory_order_release); - 调用clear方法来清除(或说“重置”)flag,从而释放锁
  4. test_and_set包含了读修改写的过程,所以使用了std::memory_order_acquire
    1. 这个内存序,确保test_and_set之前的读写操作不会被重新排到test_and_set的后面
    2. 换句话说,确保flag被成功修改后,其他线程看到的flag的值以及flag之前的值,都是修改完成的
  5. clear这里用了memory_order_release,是因为这是一个写操作
    1. 它保证了这个操作之前的所有当前线程中的写操作对其他线程都是可见,确保其他的这些操作不会被重新排在这个操作的后面

无锁线程安全栈

  1. push操作介绍
    1. compare_exchange_weak 是一个原子操作,它的工作方式是:比较 head 的当前值是否等于 new_node->next(也就是我们之前读取的旧的栈顶)
    2. 如果它们相等,那么 head 将被更新为 new_node,也就是我们新创建的节点
    3. 如果不等,那么 new_node->next 将被更新为当前的 head 值,并再次尝试该操作
    4. 这里使用循环,因为 compare_exchange_weak 可能会失败,即使 head 没有发生变化。因此,需要反复尝试,直到成功为止

无锁线程安全队列

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-09-24
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享