博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无锁栈与无锁队列
阅读量:4656 次
发布时间:2019-06-09

本文共 1577 字,大约阅读时间需要 5 分钟。

互斥的硬件支持

中断禁用

单处理器机器中,并发进程不能重叠只能交替,因此保证互斥,主要保证进程不被中断就可以了

禁用中断临界区启用中断其他部分

专用机器指令

  • test_and_set

    #include 
    #include
    #include
    #include
    std::atomic_flag lock = ATOMIC_FLAG_INIT;void f(int n){ for (int cnt = 0; cnt < 100; ++cnt) { while (lock.test_and_set(std::memory_order_acquire)) // acquire lock ; // spin std::cout << "Output from thread " << n << '\n'; lock.clear(std::memory_order_release); // release lock }}int main(){ std::vector
    v; for (int n = 0; n < 10; ++n) { v.emplace_back(f, n); } for (auto& t : v) { t.join(); }}
    在所有并发进程之前将flag设置为false,每次test_and_set都会设置flag是true,然后自动返回原始值
    • 原始值为false,则还未锁,可以上锁并进入临界区,需要离开临界区时重新将flag设置为false
    • 原始值为true,则已上锁
    详见
  • compare_and_swap

    template< class T >bool atomic_compare_exchange_strong_explicit( volatile std::atomic
    * obj,  typename std::atomic
    ::value_type* expected,  typename std::atomic
    ::value_type desired, std::memory_order succ,                                               std::memory_order fail ) noexcept;
    compare_and_swap(obj, expected, desire)简称CAS,是一种乐观锁。
    先检查obj所指的值是否和expected所指的值相同
    • 若相同则将obj所指的值更新为desire,返回true
    • 若不同则将expectd所指的值更新为obj所指的值,返回false

    详见

无锁栈与无锁队列的实现

参考

转载于:https://www.cnblogs.com/qbits/p/11206306.html

你可能感兴趣的文章
CodeForces 778D Parquet Re-laying 构造
查看>>
jquery的uploadify插件实现的批量上传V3.2.1版
查看>>
android架构
查看>>
声明式事务
查看>>
vlc客户端rtsp播放live555的.264文件
查看>>
使用Solrj 获取语句分词结果的代码
查看>>
Python in neuroimaging
查看>>
leetcode 575. 分糖果(Distribute Candies)
查看>>
科学计算和可视化
查看>>
IOS界面篇
查看>>
php正则
查看>>
NumPy(数组计算)
查看>>
设计模式之单例模式
查看>>
集团财务治理下的信息化规划
查看>>
63.Unique Paths II
查看>>
[HNOI2015]实验比较
查看>>
搭建自动化构建
查看>>
完成评论功能
查看>>
ProjectEuler 13
查看>>
[转]基于SAML的单点登录介绍
查看>>