0

Я хочу подождать, пока две переменные bool будут истинными в одном потоке. Они меняются в разных местах. Я могу использовать boost в моем проекте, но не C++ 11. Я нашел информацию о том, как использовать мьютексы и переменные условия, но я не уверен, можно ли ожидать двух мьютексов. Это какой-то псевдокод моей программы.Синхронизация нити: Подождите, пока две переменные bool.

bool job1_dataready, job2_dataready; 

//t1: 
void job1() 
{ 
    //do stuff 
    job1_dataready = true; 
} 

//t2: 
void job2() 
{ 
    //do stuff 
    job2_dataready= true; 
} 

main() 
{ 
boost::thread t1(job1); 
boost::thread t1(job2); 

if(job1_dataready&& job2_dataready) 
{ 
    //do stuff with data from both jobs 
} 

} 
+2

Кажется, вы забыли включить вопрос в вашем вопросе. – Biffen

+0

Ваши булевы не защищены мьютезом или другим механизмом синхронизации, и они не являются атомарными. Это означает, что доступ из основного и рабочего потоков будет несинхронизирован и, следовательно, не определено поведение. (Это не ответ на вашу проблему, просто чтобы указать, что ваша текущая попытка никуда не денется.) – MSalters

ответ

6

от того, что я вижу, что вам не нужно Bool переменные, используйте std::thread::join вместо:

main() { 
    std::thread t1(job1); 
    std::thread t1(job2); 
    t1.join(); 
    t2.join(); 
    // do jobs after threads t1 and t2 finish working 
} 
+0

Идеальный ответ с одной незначительной проблемой - OP утверждает, что C++ 11 не используется, но boost is. Чтобы ответ был звездным, подумайте о том, чтобы выразить то же самое с повышением. – SergeyA

+0

Идеальное решение для моей проблемы. Я использую 'boost :: thread' of cource – tzippy

1

вы заблокируют на условной переменной, проверить логические значения, когда проснулись, и либо вернуться для ожидания или продолжения обработки. Ваши потоки будут сигнализировать переменную условия после того, как они установили булевский флаг. Все с соответствующей блокировкой мьютекса. Вы можете ждать бесконечное количество условий, просто проверьте, когда они проснулись после блокировки состояния.

0

В простых ситуациях, например, вы ждете двух мьютексов, просто блокируя их по порядку. Сначала вы блокируете мьютексы из потока 1, затем мьютекс из потока 2. Если поток 2 завершит до потока 1, основной поток просто не будет блокироваться при блокировке мьютекса 2.

Однако обратите внимание, что это ответ вам ваш вопрос, но не решение вашей проблемы. Причина в том, что у вас есть условие гонки с мьютексом: основной поток может блокировать мьютекс до начала рабочего потока. Итак, хотя ответ Андрея Р. (std::thread::join) не является прямым ответом, это правильное решение.

0

Если вы планируете установить свои два bool s перед тем, как соответствующие потоки завершатся, тогда Andrei R.'s solution всего лишь join, введя два потока, безусловно, лучший способ пойти. Однако, если ваши потоки продолжают работать после достижения dataready точек и, таким образом, не заканчиваются, вам нужен другой подход. В этом случае, вы можете использовать два std::future/std::promise объекты, которые будут выглядеть примерно так:

std::promise<bool> job1_dataready, job2_dataready; 

//t1: 
void job1() 
{ 
    //do stuff 
    job1_dataready.set_value(true); // The value doesn't actually matter 
    //do more stuff 
} 

//t2: 
void job2() 
{ 
    //do stuff 
    job2_dataready.set_value(true); 
    //do more stuff 
} 

main() 
{ 
    std::future<bool> job1_future = job1_dataready.get_future(); 
    std::future<bool> job2_future = job2_dataready.get_future(); 

    boost::thread t1(job1); 
    boost::thread t2(job2); 

    job1_future.wait(); 
    job2_future.wait(); 
    if (job1_future.get() && job2_future.get()) // True unless something was aborted 
    { 
    //do stuff with data from both jobs 
    } 
} 
+0

Это выглядит многообещающим. К сожалению, я не могу использовать C++ 11, и boost :: future, похоже, не существует в моей версии boost (1.49, не может обновляться). – tzippy

+0

Хм, согласно документам для 1.49.0, должен быть ['boost :: unique_future'] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread .synchronization.futures). – mindriot

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