Отмена потока POSIX после выполнения общей работы - PullRequest
5 голосов
/ 19 августа 2011

Есть несколько потоков, работающих над задачей.Как только поток завершается успешно, весь поток должен быть отменен, поскольку работа завершена.Как я могу отменить другие темы, как только один поток успешно завершен?Кто будет вызывать pthread_cancel () и как успешный поток скажет main или поток, который его породил (возвращаемое значение?).

ОБНОВЛЕНИЕ

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

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Вы можете выбрать простую схему, где main делает все.

Пусть main запустит все потоки и сделает down на каком-то семафоре.Когда поток завершает задачу, выполните up для этого семафора.Когда main разблокирован, он может pthread_cancel всех потоков (а затем pthread_join, чтобы убедиться).

Таким образом main запускает и останавливает все потоки, поэтому все должно быть довольно просто.

1 голос
/ 19 августа 2011

Одним простым способом является вызов exit(), который завершает процесс вместе со всеми потоками.Его можно вызывать из любого потока.

Другой способ заключается в том, чтобы ваш основной поток порождался и ожидал рабочих потоков, и после завершения одного из рабочих потоков:

  • красиво скажите другим потокам прекратить и подождать, пока они это сделают, или
  • внезапно pthread_cancel() их.По умолчанию потоки создаются с PTHREAD_CANCEL_DEFERRED, что означает, что они не прекратят работу, пока не вызовут какую-либо из функций точки отмены, см. Хорошее описание в Отмена потока .Итак, если ваши потоки выполняют какие-то длинные вычисления, вы можете установить их состояние отмены на PTHREAD_CANCEL_ASYNCHRONOUS, чтобы немедленно завершить поток, см. pthread_setcanceltype .
...