2013-07-18 2 views
2

Я попытался реализовать condition_variable с двумя потоками, следующий код будет работать хорошо, если я не буду использовать пользовательский ввод (std::cin), но как только я его использовал, программа разбилась после ввода числа на экране.C++ condition_variable cin и cout

Почему он падает?

std::mutex mu; 
std::condition_variable cond; 
int x =0; 
void th_in() 
{ 
    std::unique_lock <mutex> locker(mu); 
    std::cin>>x; 
    locker.unlock(); 
    cond.notify_all(); 
} 
void th_out() 
{ 
    std::unique_lock <mutex> locker(mu); 
    cond.wait(locker); 
    std::cout<<x<<std::endl; 
    locker.unlock(); 
} 

int main() 
{  
    std::thread t2(th_out); 
    std::thread t1(th_in);  
    std::cin.get(); 
    return 0; 
} 
+0

Боковая информация: 'std :: condition_variable' может вызвать« ложную пробушку », поэтому' cond.wait (locker); 'будет разблокирован, когда' th_in' не вызывает 'cond.notify_all();'. См. Также [std :: condition_variable] (http://en.cppreference.com/w/cpp/thread/condition_variable). – yohjp

ответ

5

Это происходит потому, что ваша программа выхода, когда вы даете вход (std::cin.get()), и вы не отделяя нити или присоединиться к ним.

В параллельности в действии по Anthony Williams, утверждается, что std::thread::join или std::thread::detach должен вызываться явно до того, как объект std::thread уничтожен, еще std::terminate будет называться.

Следовательно, аварии.


Вы можете это исправить, имея int main ждать для нити, чтобы завершить выполнение:

int main() { 
    std::thread t2(th_out); 
    std::thread t1(th_in); 

    t2.join(); 
    t1.join(); 

    std::cin.get(); 
    return 0; 
} 

Это должно быть безопасным. Это также устраняет проблему, вызванную тем, что 2 потока заблокированы по std::cin.

Смежные вопросы