2016-03-21 5 views
1

Я использую импульс 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?

ответ

6

Заменить

boost::mutex::scoped_lock(mx1); 

с

boost::mutex::scoped_lock lock(mx1); 

вы пали жертвой наиболее часто встречающемся опечатка с контекстными замком :-)

+0

Спасибо! : D Теперь так очевидно, что я вижу проблему! Я полагаю, вам нужно объявить объект в определенной области, чтобы этот объект вышел из области видимости. – zappyzap

+0

Ты так не одинок в этом! – bobah