2010-05-23 128 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