Усилить синхронизацию потоков - PullRequest
1 голос
/ 23 мая 2010

Я не вижу синхронизированный вывод при комментировании строки wait(1) в thread(). я могу заставить их работать одновременно (один за другим) без необходимости использовать wait (1)?

#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();
}

1 Ответ

3 голосов
/ 23 мая 2010

«одновременно (одно за другим)» противоречиво.При звонке на sleep() они запускаются одновременно.Без вызова sleep() они запускаются один за другим.При выводе только 100 строк поток t1 завершается до того, как t2 изменится, чтобы начать выполнение.На моем компьютере мне пришлось установить счетчик циклов на 10000, прежде чем t1 побежал достаточно долго для запуска t2, пока t1 все еще выполнял:выполнение потоков выполняется по очереди, 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...