У меня есть функция, которая устанавливает значение двух переменных и ожидает, что два потока печатают значение. Затем обновите значение и так далее ...Boost thread condition variable three thread
С основной и одной нитью он работает, но с двумя нет. Это мой код:
void t(int id){
bool block_me = true;
while(1)
{
{
boost::mutex::scoped_lock lock(m);
while(!start_t || thread_executed > 0)
start_thread.wait(lock);
}
// Print myself
cout<<id<<endl;
{
boost::mutex::scoped_lock lock(m);
thread_executed++;
if(thread_executed == 2){
start_main.notify_one();
}
}
}
}
int main(){
thread_executed = 0;
start_t = false;
boost::thread t1(boost::bind(&t, 1));
boost::thread t2(boost::bind(&t, 2));
for(int i = 1; i < 10; i++){
cout<<"i = "<<i<<endl;
{
boost::mutex::scoped_lock lock(m);
start_t = true;
thread_executed = 0;
start_thread.notify_all();
while(thread_executed != 2){
start_main.wait(lock);
}
start_t = false;
thread_executed = 0;
start_thread.notify_all();
}
}
return 0;
}
Если вы хотите, чтобы сигнализировать производитель обратно, это costumary иметь второе переменное условие. Кроме того, доступ ** все * общие переменные только под блокировкой (вы нарушаете это слева и справа) – sehe
Похоже, вы ищете [барьер] (http://www.boost.org/doc/libs/ 1_57_0/doc/html/thread/synchronization.html # thread.synchronization.barriers) – sehe
Я не знаю ... Мне нужно условие для потока, чтобы запустить печать Simpe и условие для основного изменить значение «один» и «два» ... – gepeppe