Уничтожение pthread внутри C без уничтожения всего процесса - PullRequest
2 голосов
/ 19 июля 2011

У меня есть параллельная программа на C, работающая на архитектуре с общей памятью с использованием pthreads. Как убить поток, не убивая весь процесс? То есть если один поток заканчивается первым, я хочу дождаться всех остальных, прежде чем выйти. exit(status_code) убивает весь процесс, а это не то, что я хочу. У меня может быть барьер, подождать, пока все нити достигнут барьера, и затем выйти, но может быть более простой путь?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

Используйте pthread_join в «основном» потоке (драйвере), чтобы дождаться завершения всех остальных.

Чтобы выяснить, что означает «поток завершается» выше, посмотритена странице управления pthread_exit говорится:

Выполнение возврата из функции запуска любого потока, кроме основного, приводит к неявному вызову pthread_exit () с использованиемВозвращаемое значение функции в качестве состояния выхода потока.

Так что pthread_join ожидает присоединенного потока, чтобы либо вернуть из него функцию запуска, либо вызвать pthread_exit.

(Вам нужночтобы отслеживать все потоки, которые вы создали, чтобы использовать это. И ничего из этого не работает, если вы отсоединили потоки обработки - в любом случае, вам, вероятно, не следует делать это в этом случае.)

5 голосов
/ 19 июля 2011

Вы можете использовать функцию pthread_join(), чтобы присоединиться ко всем вашим потокам.

В качестве примера, скажем, вы создали 5 потоков и хотите завершить свою работу из основной функции, когда все потоки завершены.

pthread_t threadId[5]; // holder for 5 thread

// Create 5 threads
for(index = 0; index < 5; index++)
    pthread_create(&(threadId[index]), NULL, producer, (void *) &(argsForProducers[index]));

// Join them
for (index = 0; index < 5; index++) 
    pthread_join(threadId[index], NULL);
1 голос
/ 19 июля 2011

Вы можете вызвать pthread_exit(), чтобы завершить поток, в котором вы находитесь. Если вы хотите убить поток из другого потока, вы можете вызвать pthread_cancel(threadToKill).Для синхронизации всех потоков вы можете позвонить pthread_join().

0 голосов
/ 19 июля 2011

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

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