2017-04-19 116 views
-1

我正在閱讀二進制信號量和互斥量(Difference between binary semaphore and mutex)之間的差異,我想驗證的一件事是,當一個任務鎖定(獲取)互斥鎖時,只有它可以解鎖(釋放)它。如果另一個任務試圖解鎖它沒有鎖定的互斥鎖(因此不擁有),那麼會遇到錯誤條件,最重要的是,互斥鎖未解鎖,並且我在C++ 14代碼下創建了這個互斥鎖:std :: mutex如何在不同的線程中解鎖?

#include <iostream> 
#include <thread> 
#include <mutex> 
#include <chrono> 
using namespace std; 

int counter; 
int i; 
std::mutex g_pages_mutex; 
void increment() 
{ 
    std::cout<<"increment...."<<std::endl;  
    g_pages_mutex.lock(); 
    bool flag = g_pages_mutex.try_lock(); 
    std::cout<<"increment Return value is "<<flag<<std::endl; 
    counter++; 
    std::this_thread::sleep_for(5s); 
} 
void increment1() 
{ 
    std::this_thread::sleep_for(5s);  
    std::cout<<"increment1...."<<std::endl;  
    g_pages_mutex.unlock();  
    counter++; 
    bool flag = g_pages_mutex.try_lock(); 
    std::cout<<"increment1 Return value is "<<flag<<std::endl; 
} 
int main() 
{ 
    counter = 0; 
    std::thread t(increment); 
    std::thread t1(increment1); 
    t.join(); 
    t1.join(); 
    return 0; 
} 

但是這個例子我能解開從線程互斥體不擁有這一點,所以只是想有一些瞭解的差距還是這個問題在C++ 14的std ::互斥?

+0

http://en.cppreference.com/w/cpp/thread/mutex/unlock – Mat

+0

[std :: mutex :: unlock描述]的開頭語句(http://en.cppreference。 com/w/cpp/thread/mutex/unlock)非常明瞭。 *「互斥量必須被當前執行線程鎖定,否則,行爲是不確定的。」* – WhozCraig

回答

3

std::mutex調用try_lock(不遞歸)調用線程擁有,不擁有互斥調用unlock通過調用線程,並在持有互斥鎖時結束線程,都會導致未定義的行爲。

它可能會成功,它可能會失敗並拋出一個異常,它可能會格式化您的硬盤驅動器,它可能召喚惡魔,它可能會時間旅行和糾正您的代碼,或者它可能會做別的。就標準而言,任何東西都是允許的。

-1

cppreference std::mutex(重點煤礦):

如果同時還通過任何線程,同時擁有互斥或線程終止時所擁有的互斥體被破壞程序的行爲是不確定的。

從同一網站上std::mutex::try_lockTC points out in their answer

如果try_lock是由已經擁有互斥線程調用的,行爲是不確定的。

而且還std::mutex::unlockTC points out in their answer

互斥量必須執行的當前線程被鎖定,否則,行爲是不確定的。

無論你的函數和線程導致未定義的行爲:

  1. increment電話lock()然後try_lock():未定義行爲
  2. increment1電話unlock()擁有互斥前:未定義行爲

刪除try_lock()從如果在線程結束之前不呼叫unlock(),則仍然會導致未定義的行爲。

你應該更喜歡使用std::lock_guard,或者一個簡單的int你也可以使用std::atomic

+0

我懷疑這有什麼問題,但如果我知道它是什麼,我會被詛咒的。 – Tas

0

用於調用unlock的前提條件是保持該互斥的所有權,根據(STD)30.4.1.2:

表達m.unlock()應被良好形成並且具有以下語義:

要求:調用線程應擁有互斥量。

由於執行線程increment1不具有互斥量的所有權,因此它引爆了未定義的行爲。

相關問題