2013-01-07 85 views
4

我想將我的代碼從boost提升到std-threads。雖然我認爲它應該是非常直接的,但我遇到了奇怪的問題。下面的代碼是使用VS2012激發斷言「f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ thr \ mutex.c(131):解除無主互斥鎖」的最小示例。尋找這個帶來了older bug reports哪(我認爲)應該已經修復。C++ 11 VS2012中的線程/互斥鎖實現 - 斷言觸發

int result = 0; 
std::mutex m; 
m.lock(); 
std::thread t1([&](){ 
    result = 42; 
    m.unlock(); 
}); 
m.lock(); 
std::cout << result << std::endl; 
t1.join(); 

有人可以向我解釋爲什麼這不起作用嗎?

感謝

+0

你正在鎖定'm'兩次? –

回答

11

m.unlock()要求調用線程擁有互斥。您的代碼不符合該要求(因爲unlock() ing線程永遠不會調用m.lock()),因此程序的行爲未定義。

+0

我很驚訝這個限制 - 從來沒有受到它的影響。我想這是條件變量的一個很好的用例?! – Daniel

+2

它反映了其他互斥API中的只有互斥所有者才能放棄其所有權的要求。 Pthread互斥鎖和Windows臨界區都有這個限制。你應該使用什麼取決於你正在嘗試使用它們。 – bames53

+2

@Daniel:不要使用原生互斥。使用'std :: lock_guard'代替安全的SBRM防護裝置。 –