Что такое сигнальная пауза? - PullRequest
3 голосов
/ 23 февраля 2012

Есть ли способ в API pthreads, чтобы я мог один поток проинструктировать либо самому, либо другому потоку сделать паузу?

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

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Для этой цели вы можете использовать мьютексы и условные переменные.


Чтобы указать другому потоку сделать паузу:

  1. Блокировка мьютекса.

  2. Установить для общей переменной pause значение true.

  3. Отключить мьютекс.


Чтобы проверить, нужно ли вам сделать паузу:

  1. Блокировка мьютекса.

  2. Убедитесь, что для переменной pause установлено значение true.

  3. Если нет, отпустите мьютекс и продолжайте.

  4. Если это так, заблокируйте переменную условия и перейдите к шагу 2.


Чтобы приостановить поток:

  1. Блокировка мьютекса.

  2. Установите для переменной pause значение false.

  3. Трансляция переменной условия.

  4. Отключить мьютекс.

Но я должен отметить, что это почти наверняка не разумно. Нет никаких причин, по которым вам стоит приостановить поток. Ваша внешняя проблема, вероятно, что-то вроде остановки процесса от выполнения работы определенного типа. Это должно быть сделано, приказывая потокам выполнять другую работу, а не мешая им выполнять любую работу.

6 голосов
/ 24 февраля 2012

В стек pthread / POSIX Thread , вы можете использовать pthread_kill для отправки сигналов отдельным потокам;но, к сожалению, это не включает «остановить», «продолжить» или «прекратить».См. Примечания здесь

Если вас интересует только приостановка потока;хитрая формула мьютексов и условных переменных - лучший путь вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...