Повысить синхронизацию потоков в сборке релиза - PullRequest
2 голосов
/ 14 мая 2010

при попытке запустить следующий код в режиме отладки и выпуска в 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 ]

1 голос
/ 14 мая 2010

Если вы раскомментируете вызов на wait(), очевидно, что оба потока работают одновременно.Аналогично, если вы увеличите число циклов, запущенных до 1000, вы увидите, что потоки чередуются (ну, 1000 на моем компьютере; это может занять больше или меньше).

Помните, что сборка выпуска оптимизировано , поэтому задачи почти всегда занимают меньше времени, и потоки могут планироваться по-другому в сборке выпуска, чем в отладочной сборке.

1 голос
/ 14 мая 2010

Оба сценария верны. В режиме деблокирования t1 уже закончен до запуска t2. Разница между отладкой и выпуском чисто случайна. Поскольку релиз запускается быстрее, вы получаете другое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...