Я использую импульс 1.54.0 и Visual Studio 2010. Для кода:повышение :: scoped_lock появляется не замыкаться зЬм :: COUT
#include <iostream>
#include "boost/thread/thread.hpp"
#include "boost/thread/mutex.hpp"
boost::mutex mx1;
void func1()
{
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
}
int x = 0;
for (int i=0; i<100; i++)
x++;
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " finished." << std::endl;
}
}
int main(void)
{
boost::thread thread1(&func1);
boost::thread thread2(&func1);
thread1.join();
thread2.join();
return 0;
}
Около половины времени я получаю следующее (с переменным нить идентификаторы и порядок выполнения, очевидно):
Thread Thread 15b0 starting work.
1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
... вместо этого (что я бы ожидать):
Thread 15b0 starting work.
Thread 1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
Однако, используя
mx1.lock();
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
mx1.unlock();
... похоже, без проблем.
Выход всегда, кажется, соответствует одному и тому же шаблону. Я неправильно использую мьютекс, или это что-то связано с std :: cout?
Спасибо! : D Теперь так очевидно, что я вижу проблему! Я полагаю, вам нужно объявить объект в определенной области, чтобы этот объект вышел из области видимости. – zappyzap
Ты так не одинок в этом! – bobah