Могу ли я заблокировать поток и его дочерние элементы в C ++ - PullRequest
0 голосов
/ 28 мая 2020

У меня есть такой код

Create thread_1 and bind task 1 to that;
Create thread_2 and bind task 2 to that;
Create thread_3 and it monitors the keyboards and work as follow:
     while(true){
       get the next key;
       if (the next key == 'p')
            pause_the_code();
       if (the next key == 'r')
            resume_the_code();
       if(the next key == 'q'
            exit the while loop
      }
// can I here block the Thread_1 and _Thread_2 with all of their children 
//with wait() when I call pause_the_code(); or notify them when I call resume_the_code();

Обратите внимание, что каждый из hread_1 и Thread_2 может динамически создавать разные группы потоков.

1 Ответ

2 голосов
/ 28 мая 2020

Нет, вы не можете выйти из одного потока и приостановить или заблокировать другой поток. Это небезопасно.

То, что вы делаете, - это создаете способ для потоков блокировать себя, проверяя это.

  • Вы можете использовать atomi c логическая переменная, названная что-то вроде running, и когда она была ложной, запускала небольшой l oop со сном.

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

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

...