Сценарий потока потоков - PullRequest
       5

Сценарий потока потоков

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

Я хочу добиться следующего вида сценария с использованием pthreads: в пуле потоков есть два вида потоков.Первый тип выполняет, скажем, fun1, второй выполняет fun2.Основной поток запускает эти два потока (для простоты предположим, что в пуле есть только два рабочих потока, каждый из двух указанных выше видов).Затем основной поток ожидает завершения одного из потоков.Первый завершающий поток уведомляет основной поток, затем основной поток должен уведомить другой рабочий поток о прекращении выполнения своей работы.И цикл продолжается.

Теперь, если я хочу остановить выполнение потока своей работой, что может быть похоже на получение memmove / lock, то я думаю, что лучше всего просто убить / отменить этот поток и воссоздать его.Что вы, ребята, думаете?

Кроме того, если я отменю поток (pthread_cancel), то мне придется вызвать pthread_join, чтобы убедиться, что он действительно отменен, а затем воссоздать его.Это правда?

Спасибо, Нилеш.

1 Ответ

2 голосов
/ 11 августа 2011

Нет такой вещи, как уничтожение потока с помощью pthreads.Как вы обнаружили, есть отмена, но все зависит от того, действует ли она на отмену.Отмена будет действовать только в том случае, если (1) она не была заблокирована с помощью pthread_setcancelstate(PTHREAD_CANCEL_DISABLE); и (2) поток вызывает функцию, которая является точкой отмены.

Вы также правы относительно необходимости использованиясвоего рода операция синхронизации, чтобы гарантировать отмену.Один из способов сделать это - вызвать pthread_join в потоке, но это может быть проблематично, если другая точка в вашей программе уже может вызывать pthread_join для него (вызов pthread_join дважды вызывает UB!).В этом случае вы можете установить обработчик очистки отмены, который отправляет сообщение на семафор или сигнализирует переменную условия при его запуске, и таким образом ждать уведомления.

...