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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

【VS开发】C++线程安全

發布時間:2024/10/12 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【VS开发】C++线程安全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們是多么渴望各種C++類都是多線程安全的,然而一旦涉及到對象間的交互,這樣的渴望可能就只能是奢望了。下面,我們以設計一個雙向鏈結點為例,看看要使其多線程安全將會帶來一些什么問題。

class?DoublyLinedNode{

???????DoublyLinedNode*?pPrevNode_;

???????DoublyLinedNode*?pNextNode_;

?

public:

???????DoublyLinedNode() :?pPrevNode_(0),?pNextNode_(0){}

???????virtual?~DoublyLinedNode();

?

public:

???????const?DoublyLinedNode*?GetPrevNode()?const{return?pPrevNode_;}

???????const?DoublyLinedNode*?GetNextNode()?const{return?pNextNode_;}

?

public:

???????void?InsertPrevNode(DoublyLinedNode*?p);

???????void?InsertNextNode(DoublyLinedNode*?p);

???????void?Break();

};

這是一個簡單的雙向鏈結點類,我們就討論討論其Break接口,這個接口的作用是使結點從其所在的鏈中斷開,如圖:

?

它的實現可能是這樣的:

void?DoublyLinedNode::Break()

{

???????if?(pPrevNode_)

???????{

??????????????pPrevNode_->pNextNode_?=?pNextNode_;

???????}

???????if?(pNextNode_)

???????{

??????????????pNextNode_->pPrevNode_?=?pPrevNode_;

???????}

???????pPrevNode_?= 0;

???????pNextNode_?= 0;

}

這個實現是單線程模式的,沒有多線程安全性。

第一次嘗試:

void?DoublyLinedNode::Break()

{

Lock();

???????if?(pPrevNode_)

???????{

??????????????pPrevNode_->pNextNode_?=?pNextNode_;

???????}

???????if?(pNextNode_)

???????{

??????????????pNextNode_->pPrevNode_?=?pPrevNode_;

???????}

???????pPrevNode_?= 0;

???????pNextNode_?= 0;

???????UnLock();

}

我們第一次嘗試將這個接口的代碼用多線程鎖鎖住了,然而問題很明顯

if?(pPrevNode_)

{

???????pPrevNode_->pNextNode_?=?pNextNode_;

}

if?(pNextNode_)

{

???????pNextNode_->pPrevNode_?=?pPrevNode_;

}

我們這兩個對前向和后向結點的操作是修改另外兩個對象的內部狀態,多線程中,可能在此時正好有其他線程在對這兩個對象進行操作(訪問),或許程序就會因此而崩潰。

第二次嘗試:

void?DoublyLinedNode::Break()

{

Lock();

???????if?(pPrevNode_)

???????{

??????????????pPrevNode_->SetNextNode(pNextNode_);?// SetNextNode同樣添加了鎖保護

???????}

???????if?(pNextNode_)

???????{

??????????????pNextNode_->SetPrevNode(pPrevNode_);?// SetPrevNode同樣添加了鎖保護

???????}

???????pPrevNode_?= 0;

???????pNextNode_?= 0;

???????UnLock();

}

這第二次嘗試將我們對前向和后繼結點的內部狀態的直接修改改成了對其接口的調用,我們試圖通過在其各種接口中加鎖來達到多線程安全的目的。然而這卻引入了新的問題,我們在一個被鎖住的代碼中進行了又調用了另外會使用鎖的代碼,這最可能引發的問題就是資源競爭,而在我們這次嘗試中引如的問題的確就是資源競爭,導致死鎖

?

我們在不同線程中對結點1和結點2同時調用Break,當1申請到自身的鎖之后,準備調用2的接口,此時2也申請到了自身的鎖,準備調用1的接口。由于1已經占有了自身的鎖,2也占有了自身的鎖,那么1將會在調用2的接口的地方等待2的鎖,而2將會在調用1的接口的地方等待1,?1和2的相互等待就形成了死鎖

第三次嘗試:

void?DoublyLinedNode::Break()

{

Lock();

???????if?(pPrevNode_)

???????{

pPrevNode_->?Lock();

??????????????pPrevNode_->SetNextNode(pNextNode_);

pPrevNode_->?UnLock?();

???????}

???????if?(pNextNode_)

???????{

pNextNode_->?Lock();

??????????????pNextNode_->SetPrevNode(pPrevNode_);

pNextNode_->?UnLock?();

???????}

???????pPrevNode_?= 0;

???????pNextNode_?= 0;

???????UnLock();

}

這次嘗試顯得比較愚蠢,將外部對象加鎖的過程提到了自身Break當中效果和第二次嘗試是一樣的,沒有得到任何的改善。

第四次嘗試:

void?DoublyLinedNode::Break()

{

SharedLock();

???????if?(pPrevNode_)

???????{

??????????????pPrevNode_->SetNextNode(pNextNode_);

???????}

???????if?(pNextNode_)

???????{

??????????????pNextNode_->SetPrevNode(pPrevNode_);

???????}

???????pPrevNode_?= 0;

???????pNextNode_?= 0;

???????SharedUnLock();

}

這次嘗試取得了一定的成功,對于這些關系密切,存在相互調用的對象,我們使用了共享鎖,它的確將我們的多線程訪問沖突和死鎖問題解決了,但是這個共享鎖的實現難度是相當大的,你必須要保證可能產生相互調用的對象都要進行鎖共享,那么你對于增加、修改、刪除對象這些管理工作將會變得極度困難,稍有差池就會引發問題,而且別人在使用你的類的時候也同樣需要處處小心,這不是我們所期望的。

?

以上我們進行了四次嘗試將我們的雙向鏈結點類設計成多線程安全,顯然我們已經筋疲力盡,卻未能達到滿意的效果。

在這里我建議大家設計這種類的時候盡量設計成單線程模式,在框架設計中去考慮多線程問題,比如使用單線程訪問對象,而模塊間使用異步通信來進行交互等。

?

多線程編程的確非常困難,C++在這方面又表現得力不從心,我在這里引入這個問題旨在于告誡大家在對待多線程問題上一定要細心細心再細心。

轉載于:https://www.cnblogs.com/huty/p/8518634.html

總結

以上是生活随笔為你收集整理的【VS开发】C++线程安全的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美一区二区黄色 | 免费男女乱淫真视频免费播放 | 欧美无极品 | 亚洲一区二区免费视频 | 日韩经典在线 | 国产新婚疯狂做爰视频 | 亚洲精品成人av | 欧美精品久久久久久久免费 | juliaann办公室丝袜大战 | 一级久久 | 免费三级av | 人人插人人射 | 国产精品久久精品 | 精品人妻av一区二区三区 | 猛1被调教成公厕尿便失禁网站 | 美女赤身免费网站 | 一级大片黄色 | 欧美日韩制服 | 久久国产精品久久久久久 | 亚洲青涩 | 久久久久久久久福利 | 精品视频大全 | 中文天堂在线播放 | 成年人的免费视频 | 日本特黄色片 | 俄罗斯美女一级爱片 | 精品国产乱码久久久久久1区2区 | 天天干夜夜爽 | 韩国成人在线视频 | 国产精品传媒一区二区 | 精品国产自 | 97偷拍视频| av中文字幕一区二区三区 | 中文字幕一区二区三区又粗 | 少妇高潮21p | 免费a在线 | 91正在播放| 人妻av中文系列 | 国产在线黄 | 欧产日产国产69 | 88av在线播放 | 亚洲av鲁丝一区二区三区 | 超碰p | 久久精品视频18 | 亚洲一区二区三 | 久久三级精品 | 特黄级 | 黄色网址免费 | 日一日射一射 | 亚洲婷婷免费 | 蜜桃tv在线观看 | 天堂8中文 | 精品久久久久久久久久久 | 好吊妞视频一区二区三区 | 黄色的网站免费看 | 正在播放一区二区 | 精品国产一区二区三区av性色 | 国产激情a| 暧暧视频在线观看 | 手机在线观看毛片 | 五月天爱爱 | 成人视频在线观看 | 日韩污视频在线观看 | 奇米777第四色 | 日韩在线视频免费播放 | 黄色网页免费在线观看 | 国产精品污网站 | 郑艳丽三级 | 日韩亚洲欧美一区二区三区 | 污污内射在线观看一区二区少妇 | 一本一道精品欧美中文字幕 | 国产精品s | 中字幕视频在线永久在线观看免费 | 国产精彩视频在线观看 | 91精品网| 欧美精品h | 94av| 成人涩涩网 | 韩国av免费在线 | 黄色片视频免费观看 | 精品日本一区二区 | 福利在线小视频 | 69精品在线 | 精品久久久国产 | 丁香花电影高清在线阅读免费 | 潘金莲三级野外 | 精品影视 | 日韩精品毛片 | 9i免费看片黄 | 国产超碰人人爽人人做人人爱 | 最新av不卡 | 懂色av,蜜臀av粉嫩av | 色综合天天综合网天天狠天天 | 亚洲一区二区不卡视频 | 欧洲视频在线观看 | 成人一区视频 | 欧美人与动牲交a欧美精品 欧美三级在线看 | 国产精品一区二区欧美 | 一区二区三区欧美视频 |