在发布版本中增强线程同步

时间:2010-05-13 23:25:52

标签: c++ multithreading boost

当我尝试在VS2005中的调试和发布模式下运行以下代码时。每次在控制台中看到不同的输出时,似乎在发布模式下都不会实现多线程。

1. #include <boost/thread.hpp> 
2. #include <iostream> 
3.
4. void wait(int seconds) 
5. { 
6.   boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
7. } 
8. 
9. boost::mutex mutex; 
10. 
11. void thread() 
12. { 
13.  for (int i = 0; i < 5; ++i) 
14.  { 
15.    //wait(1);
16.    mutex.lock(); 
17.    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
18.    mutex.unlock(); 
19.  } 
20. } 
21.
22. int main() 
23. { 
24.   boost::thread t1(thread); 
25.   boost::thread t2(thread); 
26.   t1.join(); 
27.   t2.join(); 
28. }

调试模式

Thread 00153E60: 0
Thread 00153E90: 0
Thread 00153E60: 1
Thread 00153E90: 1
Thread 00153E90: 2
Thread 00153E60: 2
Thread 00153E90: 3
Thread 00153E60: 3
Thread 00153E60: 4
Thread 00153E90: 4
Press any key to continue . . .

发布模式

Thread 00153D28: 0
Thread 00153D28: 1
Thread 00153D28: 2
Thread 00153D28: 3
Thread 00153D28: 4
Thread 00153D58: 0
Thread 00153D58: 1
Thread 00153D58: 2
Thread 00153D58: 3
Thread 00153D58: 4
Press any key to continue . . .

2 个答案:

答案 0 :(得分:1)

两种情况都是正确的。在释放模式中,t1在t2开始之前已经完成。调试和发布之间的区别纯粹是偶然的。因为版本运行得更快,所以你得到不同的时间。

答案 1 :(得分:1)

如果取消对wait()的调用,则很明显两个线程同时运行。同样,如果将循环运行的次数增加到1,000,您可以看到线程是交错的(好吧,我的计算机上有1,000个;它可能需要更多或更少)。

请记住,发布版本是优化的,因此任务几乎总是花费更少的时间,并且线程最终可能会在发布版本中以不同于调试版本的方式进行调度。