Как я могу проверить завершение потоков без блокировки? - PullRequest
1 голос
/ 19 марта 2011

У меня есть случайное число генерируемых потоков, и мой основной поток должен действовать как таймер в узком цикле. Я хотел бы проверить, закончились ли дочерние потоки, и если да, то я хочу разорвать жесткий цикл. Тем не менее, я не смог найти способ сделать это без блокировки.

Моя лучшая идея состояла в том, чтобы использовать переменную, равную случайному числу потоков, которые будут созданы. Когда поток собирается завершить, он должен уменьшить значение переменной. Тем временем основной поток может быстро проверить переменную, чтобы увидеть, не превышает ли она 0, если это так, продолжайте цикл.

Надеюсь, должен быть лучший путь.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Ваш основной поток должен делать что-то еще, пока он ждет?Чтобы полностью ответить на ваш вопрос, мне нужно более точное объяснение того, чего вы хотите достичь, но вот некоторые инструменты, которые могут решить вашу проблему:

  • Проверка обычной переменной на каждой итерации цикла.Вам потребуется выполнить некоторый блокирующий примитив вокруг проверки, чтобы переносимо обеспечить барьер памяти, иначе вы можете прочитать устаревшее значение.
  • Сигналы.Ужасно, но вы могли бы сделать так, чтобы рабочие потоки посылали сигнал основному потоку с pthread_kill, и это могло прервать все, что он делает.Вам придется столкнуться с вопросами о том, какие действия безопасны для асинхронного сигнала (ни одна из функций pthread не является).
  • Переменные условия.Вы можете использовать pthread_cond_wait (или pthread_cond_timedwait, если хотите выполнить какое-то действие после заданного интервала времени, если не завершено ни одного потока).
  • Семафоры.Вы можете просто использовать семафор в качестве атомного счетчика или использовать его как переменную условия.
1 голос
/ 19 марта 2011

Вы можете использовать либо pthread_tryjoin_np, либо pthread_timedjoin_np, которые не блокируются, либо имеют время ожидания.

Прочтите страницу руководства для точной семантики.Они специфичны для Linux, но не переносимы как по названию, так и по состоянию страниц руководства.Так что YMMV.

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