2010-05-23 213 views
1

當我在中註釋行wait(1)時,我看不到同步輸出。我可以讓他們同時運行(一個接一個),而不必使用'wait(1)'嗎?Boost線程同步

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

void wait(int seconds) 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

boost::mutex mutex; 

void thread() 
{ 
    for (int i = 0; i < 100; ++i) 
    { 
    wait(1); 
    mutex.lock(); 
    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
    mutex.unlock(); 
    } 
} 

int main() 
{ 
    boost::thread t1(thread); 
    boost::thread t2(thread); 

    t1.join(); 
    t2.join(); 
} 
+0

使用條件可能。 (我不熟悉boost線程。) – kennytm 2010-05-23 18:07:31

+0

http://www.boost.org/doc/libs/1_40_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref – Anycorn 2010-05-24 06:10:47

回答

3

「同時(一個接一個)」是矛盾的。打電話給sleep()他們同時運行。沒有致電sleep(),他們一個接一個跑。只有100行輸出,線程t1在t2開始執行之前完成。在我的電腦,我有你的循環計數器設置爲10000前T1跑了足夠長的時間t2的推出而T1仍在執行:

Thread 0x2305010: 0 
Thread 0x2305010: 1 
Thread 0x2305010: 2 
... 
Thread 0x2305010: 8730 
Thread 0x2305010: 8731 
Thread 0x23052a0: 0 
Thread 0x23052a0: 1 
... 
Thread 0x23052a0: 146 
Thread 0x23052a0: 147 
Thread 0x2305010: 8732 
Thread 0x2305010: 8733 
etc 

哦,是的,如果你的目標是使兩個線程取執行,boost::condition_variable是解決方案:

boost::mutex mutex; 
boost::condition_variable cv; 

void thread() 
{ 
    for (int i = 0; i < 100; ++i) 
    { 
    boost::unique_lock<boost::mutex> lock(mutex); 
    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
    cv.notify_one(); 
    cv.wait(lock); 
    } 
    cv.notify_one(); 
} 
+1

增強鏈類是有用的也許 ? – gda2004 2013-03-28 11:38:54