日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

无锁链表的c++实现

發布時間:2024/2/28 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无锁链表的c++实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡言

1.無鎖能夠實現的核心原理即CAS

2. c++語言中CAS一般有三種操作,即gcc的CAS實現,windows的CAS實現,c++11的CAS實現

3. 這篇博客主要講c++11的CAS實現,原理

4. 完整代碼下載請移步?https://blog.csdn.net/yzf279533105/article/details/119802375

概要

1. gcc的CAS實現函數如下

bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)

2.windows的CAS實現函數如下

InterlockedCompareExchange ( __inout LONG volatile *Target,__in LONG Exchange,__in LONG Comperand);

3. c++11的CAS實現函數如下

template< class T > bool atomic_compare_exchange_weak( std::atomic<T>* obj,T* expected, T desired ); template< class T > bool atomic_compare_exchange_weak( volatile std::atomic<T>* obj,T* expected, T desired );

多線程新建節點的核心原理(三步缺一不可)

1. 確定當tail->next為NULL時,就把tail->next指向新節點即可,CAS操作

2. 再把tail更新指向為新節點,CAS操作

3. 若第二步失敗或落后時,其他線程可以修正即把tail更新為最新,CAS操作

代碼如下

// 壓入隊列一個節點 void NoLockList::enqueueOne(int n) {// 新建節點Node* pnew = new Node();pnew->value = n;pnew->next = NULL;Node* ptail = NULL;Node* ptailnext = NULL;Node* pNULL = NULL;while (true){ptail = pTail; // 每次拿隊列最新的Tailptailnext = pTail.load()->next;// 若pTail不是真正鏈表末尾,則后移pTail// 注意此步不可簡單地continue,因為其他線程可能因為某種原因導致只加入了新節點,未能更新Tail指針,這里可以修正if (ptailnext != NULL){pTail.compare_exchange_weak(ptail, ptailnext);continue;}// 核心:若pTail->next為空,則確定pTail是鏈表尾節點,則pTail->next改為指向新節點,修改失敗則重試if (pTail.load()->next.compare_exchange_weak(pNULL, pnew)){// 更新尾指針pTail,即使更新失敗也沒關系,說明其他線程已經更新了pTailpTail.compare_exchange_weak(ptail, pnew);return;}} }

多線程刪除節點的核心原理(二者缺一不可)

1. 若head->next不為空,就把head指針后移,并free舊的head指針,CAS操作

2. 若head和tail指針相等,說明tail指針落后了(tail未能及時后移),就把tail指針后移,CAS操作

代碼如下

// 出隊列 int NoLockList::dequeueOne(int thread, bool stop) {Node* phead = NULL;Node* ptail = NULL;Node* pheadNext = NULL;while (true){phead = pHead;ptail = pTail;pheadNext = phead->next;// 鏈表為空(只有一個初始節點)if (pheadNext==NULL){cout<<"dequeueOne::pheadNext==NULL"<<endl;return -1;}// 鏈表不為空,但pHead指針和pTail相等,說明pTail未能及時更新,則后移pTailif (phead == ptail){cout<<"dequeueOne::phead == ptail, thread="<<thread<<endl;pTail.compare_exchange_weak(ptail,pheadNext);continue;}// 隨機暫停一段時間if (stop){usleep(500+rand()%500);}// 核心:若pList->pHead確定是鏈表頭部節點,則后移Head;失敗則重試if ( pHead.compare_exchange_weak(phead, pheadNext)){int val = phead->value;free(phead);cout<<"dequeueOne,suc, thread="<<thread<<endl;return val;}cout<<"dequeueOne::retry, thread="<<thread<<endl;} }

總結

以上是生活随笔為你收集整理的无锁链表的c++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一级片av| 成人中文网| 色婷婷九月| 欧美一级不卡视频 | 波多野结衣一区二区三区在线 | 国产高清视频在线观看 | 丁香网五月天 | 五月天中文字幕 | 777精品久无码人妻蜜桃 | 国产刺激视频 | 欧美伊人网 | 色先锋在线 | 亚洲妇熟xx妇色黄蜜桃 | av香蕉网 | 男人的天堂在线观看av | 欧美色xxxxx 日本精品一区二区三区四区的功能 | 日本黄色大片免费看 | 欧美日本另类 | 亚洲国产精品天堂 | 日本一区二区三区精品视频 | 欧美一级三级 | 国产极品一区二区 | 涩涩网站在线看 | 久久中文娱乐网 | 日韩区一区二 | 日韩三级中文 | 日韩 欧美 精品 | 丁香花电影免费播放在线观看 | 中文字幕123 | 亚洲男人的天堂av | www.xxxx国产| 日韩精品电影一区 | 欧美精品久久久久久久久老牛影院 | 日韩av无码中文字幕 | 浪漫樱花动漫在线观看免费 | 免费观看的黄色网址 | 熊猫成人网 | 久久性爱视频网站 | 在线观看国产日韩 | 国产一级视频免费观看 | 视频一二区 | 狂野欧美性猛交免费视频 | 亚洲一区二区三区在线看 | 亚洲天堂福利 | 国产三级在线 | 中文字幕一区在线播放 | 99久久精品一区 | 特级黄色一级片 | 色久综合网| 国产酒店自拍 | 福利久久久 | 日韩一区二区三区网站 | 一级黄色a毛片 | 色呦网站| 国产麻豆精品一区二区 | 欧美日韩一区在线观看 | 青青草华人在线视频 | 丰满少妇高潮一区二区 | 国产精品国产一区二区三区四区 | 日韩黄色一级片 | 国产亚洲精品电影 | 国产一区二区不卡在线 | 成人午夜网址 | 一区二区不卡视频在线观看 | 日韩欧美精品一区二区三区 | 免费在线观看av的网站 | 精品久久成人 | www.自拍 | 99在线无码精品入口 | 色av中文字幕| 伊人久久久久久久久久 | 亚洲欧美日本国产 | 丁香五色月 | 久久99热人妻偷产国产 | 中文字幕永久在线 | 在线免费播放 | 加勒比av在线播放 | 亚洲人成人无码网www国产 | 久久4| 亚洲AV无码AV吞精久久中文版 | 国产免费大片 | 亚洲av无码一区二区三区在线播放 | 麻豆av一区二区三区久久 | 欧美精品二区三区四区免费看视频 | 天天干天天干 | 日日碰狠狠躁久久躁蜜桃 | 久久h| 6090伦理| 欧美狠狠爱 | 午夜电影天堂 | 日韩一级片免费观看 | 青草福利在线 | 欧美大片免费在线观看 | av制服丝袜在线 | 免费的a级片 | 91新视频| 深夜视频在线观看 | 国产区第一页 | 影音先锋日韩资源 |