日韩性视频-久久久蜜桃-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| 成人av一区二区三区 | 高清一区二区三区视频 | 免费久久一级欧美特大黄 | 国产精品视频第一页 | 一卡二卡三卡在线观看 | 日本亚洲最大的色成网站www | 国产热 | 亚洲区视频 | 一本一道久久a久久精品综合 | 黄色小视频在线看 | 国产一区导航 | 国产黄色免费在线观看 | 国产男男一区二区三区 | 伊人久久青草 | 欧美日韩激情一区 | 国产男女在线 | 国产在线视频在线观看 | 国偷自拍| 在线播放免费av | av免费大片 | 日韩精品免费一区二区夜夜嗨 | 国产黄色免费观看 | 国产精品suv一区二区69 | 在线a级 | 成人久久久 | 一区二区日韩精品 | 好男人影视www | 一级草逼片 | 91久久久久久 | 最好看的日本字幕mv视频大全 | 成年人在线视频 | 女~淫辱の触手3d动漫 | 毛片aaa | 福利电影一区二区三区 | 国产精品7777 | 黄色网在线免费观看 | 久久一道本 | 日本人性爱视频 | 伊人成人在线观看 | 欧美a一级| 麻豆changesxxx国产 | ass东方小嫩模pics | 日韩欧美在线观看一区 | 国产又粗又黄又爽又硬的视频 | 91视频高清| 夜晚福利视频 | 日韩免费观看av | 国产破处av | 成人免费在线观看网站 | 国产一精品一aⅴ一免费 | 欧美性一级 | 精品国产av无码一区二区三区 | 一区二区三区视频免费视 | 精品1区2区| 老熟妇仑乱一区二区av | 亚洲国产精品视频在线观看 | 特级毛片爽www免费版 | 丰满人妻一区二区三区无码av | 久久亚洲精 | 中文字幕av一区二区三区人妻少妇 | 成年人网站在线免费观看 | 国产伦一区二区 | 久久免费看片 | 国产成人三级一区二区在线观看一 | 男ji大巴进入女人的视频 | 国内外成人免费视频 | 日韩有码第一页 | 噜啪啪 | 四虎一国产精品一区二区影院 | 韩国精品视频 | 亚洲av永久无码精品一区二区国产 | 久久97精品久久久久久久不卡 | 五月天色站| avtt香蕉久久 | 日本大尺度做爰呻吟舌吻 | 少妇高潮惨叫久久久久 | 无码日韩精品一区二区 | 99精品国产一区 | 日韩h在线观看 | 日韩在线一区二区 | 涩涩屋污 | 波多野结衣视频网站 | 日韩精品aaa| 婷婷另类小说 | 国产91在线 | 亚洲 | 国产在线观看免费高清 | 天堂av网址 | 93久久精品日日躁夜夜躁欧美 | 污视频网址在线观看 | 午夜av电影在线观看 | 97久草 | 秋霞成人av | 百合sm惩罚室羞辱调教 | 男女性杂交内射妇女bbwxz | 91激情|