2014-10-29 74 views
0

我在修改程序後遇到問題,可能是由於線程調用本身可以加入。在這種情況下究竟發生了什麼?如果一個std ::線程調用本身可以加入,會發生什麼?

編輯: 我做了一些調試,並problme是可連接的方法。

std::mutex threadMutex; 
std::thread tAudioProcessingThread; 

void getLock() 
{ 
    if (tAudioProcessingThread.joinable()) 
     threadMutex.lock(); 
} 

void releaseLock() 
{ 
    if (tAudioProcessingThread.joinable()) 
     threadMutex.unlock(); 
} 

功能getLock()releaseLock()從兩個現有的線程調用。 我在創建線程之前調用threadMutex.lock()threadMutex.unlock()函數時遇到問題,所以我不得不做出這些替代函數,以便在線程存在時僅調用鎖。

+1

很可能是未定義或死鎖...... – Soren 2014-10-29 18:27:37

+2

如果沒有_complete_測試用例,我們無法推測答案。 – 2014-10-29 18:32:43

+0

要正確處理鎖定,您應該考慮使用['lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard)',而不是在那裏滾動自己的東西。順便說一句,如果線程沒有真正運行,爲什麼你打擾鎖定/解鎖互斥體?!? – 2014-10-29 18:39:52

回答

1

的線程不能join()本身,但沒有什麼錯一個線程調用joinable()本身。

全部t.joinable()確實是測試t.get_id() != std::thread::id{}所以它不會影響你從哪個線程調用它。

0

卡梅隆是對的,我的錯誤是在代碼的其他地方,所以這些功能是沒有必要的,鎖定得到正確完成。

@πάνταῥεῖ:我鎖定了創建線程之前和之後調用的函數,所以我必須將鎖放在那裏。

PS:無法迴應還,這就是爲什麼有那麼多的編輯等等...

謝謝你們

相關問題