2014-03-05 80 views
1

我這個最小的代碼:爲什麼鎖不鎖?

#include <mutex> 
#include <iostream> 

std::mutex themutex; 

void f1() 
{ 
    std::cout << "1" << std::endl; 
    std::lock_guard<std::mutex> local_mutex(themutex); 
    std::cout << "2" << std::endl; 
} 

void f2() 
{ 
    std::cout << "3" << std::endl; 
    std::lock_guard<std::mutex> local_mutex(themutex); 
    std::cout << "4" << std::endl; 
    f1(); 
    std::cout << "5" << std::endl; 
} 

int main(void) 
{ 
    f2(); 
    return 0; 
} 

我編譯和

g++ -std=c++11 test_mutex.cc -o test_mutex && ./test_mutex 

運行,我得到這個輸出:

3 
4 
1 
2 
5 

爲什麼?

我希望程序在打印「1」後鎖定,永不返回。

回答

3

從30.4.1( 「互斥要求」):

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

需要:如果mstd::mutex型的或std::timed_mutex,調用線程不擁有互斥鎖。

您違反了要求,所以您不能指望標準保證的任何行爲。

+1

謝謝。只是爲了確保我明白:我,即程序員,必須確保我只嘗試調用鎖,創建一個本地鎖,每個線程最多一次。正確? – steffen

+1

@steffen:是的。如果這不可行,你可以使用'std :: recursive_mutex'。 –