std::thread單個線程永久持有鎖

最近打算寫一個curl的C++11封裝,使用Thread的時候出現(xiàn)了一個BUG,某一個線程始終持有一個鎖,反復加鎖解鎖的過程。而另外一個線程卡死在lock上。大致代碼如下:

std::mutex mtx;

//Thread 1

mtx.lock();

//...do something

mtx.unlock();


//Thread 2

do {

? ? mtx.lock();

? ? //...do something

? ? mtx.unlock();

}while(true);

Thread 2在一個死循環(huán)內(nèi)持有并加解鎖。另外一個是普通的流程函數(shù)。

代碼沒有拋出異常導致死鎖,起初以為是自己mutex不熟,用法有誤,但是反復查證,用法應(yīng)該沒問題。并且奇妙的是如果在加鎖前和解鎖后打印日志就會正常。

難道是死循環(huán)導致的嗎?

于是在Thread 2的unlock之后加了一句usleep:

mtx.unlock();

usleep(0);

在零X年的時候看過一篇帖子,說sleep(0)可以讓線程放棄當前獲得的cpu時間片。理論上這樣就可以產(chǎn)生一個中斷,讓其他線程得到執(zhí)行。

結(jié)果并沒有變化。

難道那篇帖子說的不對么。又改了下:

mtx.unlock();

usleep(1);

結(jié)果正常了,2個線程都正確的加鎖解鎖。

事后總結(jié),猜測就是因為Thread 2在解鎖之后,再次加鎖之前沒有能夠產(chǎn)生中斷的函數(shù),于是很快地又再次獲得了鎖,導致其他線程總是無法獲得鎖。這個問題和自旋鎖在單核機器上無法正常工作是一個原理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、前言 前段時間看了幾個開源項目,發(fā)現(xiàn)他們保持線程同步的方式各不相同,有@synchronized、NSLock...
    稻春閱讀 471評論 0 0
  • 鎖是一種同步機制,用于多線程環(huán)境中對資源訪問的限制iOS中常見鎖的性能對比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,558評論 0 6
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 912評論 0 1
  • 這兩天就是圍繞著期中試卷,進行修改、分析。寶爸輔導作業(yè),也是很著急。關(guān)于練字,在家督促了好多回,總是被拖過...
    ee978d8b1e98閱讀 125評論 0 0
  • 換機必備~個人推薦
    cd8b85d2c807閱讀 206評論 0 0