Завершение pthreads

0

Можно остановить поток, используя pthread_join(). Но представьте себе, что у одного есть много потоков, которые выполняют сложную задачу и могут не останавливаться одновременно. Один из них может остановиться раньше (потому что он получил нужный результат). Но как остановить другие потоки, которые могут быть почти бесконечными? Если один поток нашел правильное решение, больше не осталось, поэтому другие потоки никогда не преуспеют.

Как завершить все потоки, когда один из них получил результат и остановился?

  • 0
    Я считаю, что это дубликат, но не достаточно уверенный, чтобы иметь могучий молот: stackoverflow.com/q/12029180/10077
  • 1
    pthread_join() не останавливает поток - он ждет, пока поток не остановится самостоятельно, и получает возвращаемое значение и другие связанные структуры данных. Если вам нужен способ упорядоченного завершения работы потока, ознакомьтесь с pthread_cancel() и соответствующими подпрограммами. Чтобы принудительно уничтожить работающий поток, вам нужно понимать обработку сигналов и, например, pthread_exit() .
Теги:
multithreading
pthreads

1 ответ

0

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

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

Кроме того, просто для уточнения, pthread_join не останавливает поток. Он просто ждет окончания потока и очистки после него.

  • 0
    О pthread_join() Я просто имел в виду, что если кто-то не использует, программа будет завершена, но потоки будут жить. Я хочу, чтобы мои темы делали сложные вычисления. На самом деле хеширование. Если один поток только что сгенерировал необходимый хеш, все потоки должны остановиться. Если не все, продолжайте работать.
  • 1
    @ForceBru Если вы прервете программу, все потоки этой программы немедленно остановят выполнение, даже если они не завершили работу.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню