基于C++ STL利用CAS原子操作封装的无锁list

本文介绍了一种基于比较并交换(CAS)操作的无锁List实现,并将其与传统互斥锁方式进行了性能对比。实验结果显示,在进行大量数据插入和取出操作时,无锁List的效率明显高于使用互斥锁的List。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/oceanperfect/article/details/74940230

在做高吞吐量的项目中,性能是必须考虑的一个重要因素。而数据同步则又是重中之重,常常需要使用到锁,但是锁的使用会造成性能下降。这个时候,CAS就大显身手了,关于CAS,这里就不再多说。直接贴我基于STL list的封装的无锁list,其他容器则类似。

文件1:lockfree_list.hpp

  1. #ifndef JZ_LOCK_FREE_LIST_HPP
  2. #define JZ_LOCK_FREE_LIST_HPP
  3. #include <list>
  4. /*
  5. * 说明:基于CAS封装的无锁List。
  6. */
  7. template <typename T>
  8. class JzLockfreeList
  9. {
  10. private:
  11. std::list<T> list;
  12. private:
  13. int mutex;
  14. int lock;
  15. int unlock;
  16. public:
  17. JzLockfreeList():mutex(0),lock(0),unlock(1){};
  18. ~JzLockfreeList(){};
  19. void Lock()
  20. {
  21. while( !__sync_bool_compare_and_swap (&mutex,lock, 1) )
  22. {
  23. usleep(100);
  24. }
  25. }
  26. void Unlock()
  27. {
  28. __sync_bool_compare_and_swap (&mutex,unlock, 0) ;
  29. }
  30. void Push(T data)
  31. {
  32. Lock();
  33. list.push_back(data);
  34. Unlock();
  35. }
  36. T Front()
  37. {
  38. Lock();
  39. T data = list.front();
  40. Unlock();
  41. return data;
  42. }
  43. void PopFront()
  44. {
  45. Lock();
  46. list.pop_front();
  47. Unlock();
  48. }
  49. bool IsEmpty()
  50. {
  51. Lock();
  52. if( list.empty() )
  53. {
  54. Unlock();
  55. return true;
  56. }
  57. else
  58. {
  59. Unlock();
  60. return false;
  61. }
  62. }
  63. bool Find(T data)
  64. {
  65. typename std::list<T>::iterator it;
  66. Lock();
  67. for ( it = list.begin(); it != list.end(); ++it)
  68. {
  69. if( *it == data )
  70. {
  71. Unlock();
  72. return true;
  73. }
  74. }
  75. Unlock();
  76. return false;
  77. }
  78. };
  79. #endif


下面是我的测试结果:

插入和取出1000000个元素耗时(us):

CAS                            mutex

503691                       1045527

498933                        956898

484434                        1023751


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值