завершение потока в C - PullRequest
       10

завершение потока в C

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

У меня есть программа C, которая вызывает потоки.

iret1 = pthread_create( &thread1, NULL, readdata, NULL);
iret2 = pthread_create( &thread2, NULL, timer_func, NULL);
pthread_join(thread2, NULL);

Поток 2 возвращается после выполнения некоторой функции, после чего я хочу остановить выполнение потока 1. Как мне это сделать?

Ответы [ 6 ]

10 голосов
/ 27 июля 2011

Вы можете остановить поток, используя pthread_cancel:

pthread_cancel(thread1);

И в readdata:

/* call this when you are not ready to cancel the thread */
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
...
/* call this when you are ready to cancel the thread */
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

Подробнее см. На странице man pthread_cancel информация - есть включенный пример.

Если вы не хотите использовать pthread_cancel, вы можете использовать глобальный флаг, который устанавливается основным потоком и читается потоком 1. Также вы можете использовать любой изМетоды IPC, такие как создание канала между потоками.

2 голосов
/ 27 июля 2011

Thread1 должен иметь флаг, который он проверяет время от времени, чтобы увидеть, следует ли ему прерывать себя.

Есть способы прервать поток извне, но это очень опасно.Не.

Что-то вроде:

thread1stop=TRUE; //Thread 1 has access to this boolean value
pthread_join(thread1, NULL);
2 голосов
/ 27 июля 2011

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

Не пытайтесь принудительно завершить поток извне, поскольку это приведет к тому, что объекты синхронизации останутся в неопределенном состоянии, приведут к блокировке и т. Д.

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

Функция pthread_cancel () отправляет запрос отмены в поток.

После отправки запроса на отмену цепочки вы должны проверить код возврата, чтобы подтвердить, что цепочка была действительно отменена или нет.

Вот простой пример:

rc = pthread_cancel(iret2);
if(rc) printf("failed to cancel the thread\n");

Для дальнейшей справки:

http://cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-39.htm

Другие источники, которые могут быть вам полезны.

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html

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

tkill (tid, SIGTERM) - это вызов, который вы ищете, я верю.

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

Вы можете остановить thread1, вызвав pthread_cancel(thread1).

...