2016-03-21 78 views
1

我使用升壓1.54.0和Visual Studio 2010的代碼:的boost :: scoped_lock的似乎不是鎖定性病::法院

#include <iostream> 
#include "boost/thread/thread.hpp" 
#include "boost/thread/mutex.hpp" 

boost::mutex mx1; 

void func1() 
{ 
    { 
     boost::mutex::scoped_lock(mx1); 
     std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl; 
    } 
    int x = 0; 
    for (int i=0; i<100; i++) 
     x++; 
    { 
     boost::mutex::scoped_lock(mx1); 
     std::cout << "Thread " << boost::this_thread::get_id() << " finished." << std::endl; 
    } 
} 

int main(void) 
{ 
    boost::thread thread1(&func1); 
    boost::thread thread2(&func1); 
    thread1.join(); 
    thread2.join(); 
    return 0; 
} 

大約有一半的時間我得到以下(具有不同線程ID和執行順序,很明顯):

Thread Thread 15b0 starting work. 
1a18 starting work. 
Thread 15b0 finished. 
Thread 1a18 finished. 

...而不是這個(這是我所期望的):

Thread 15b0 starting work. 
Thread 1a18 starting work. 
Thread 15b0 finished. 
Thread 1a18 finished. 

但是,使用

mx1.lock(); 
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl; 
mx1.unlock(); 

...似乎沒有問題。

輸出總是似乎遵循相同的模式。我是否錯誤地使用了互斥鎖,或者它是否與std :: cout有關?

回答

6

更換

boost::mutex::scoped_lock(mx1); 

boost::mutex::scoped_lock lock(mx1); 

你愛上了範圍的鎖最頻繁出現的錯字的受害者:-)

+0

謝謝! :D現在很明顯我發現問題了!我想你需要在一個特定的範圍內聲明一個對象,使其超出範圍。 – zappyzap

+0

你並不孤單! – bobah