Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
exit(EXIT_FAILURE);}Когда вы запустите программу, то получите следующий вывод:
$ <b>./thread6</b>Waiting for thread to say it's finished...thread_function is running. Argument was Hello WorldWaiting for thread to say it's finished...Waiting for thread to say it's finished...Waiting for thread to say it's finished...Second thread setting finished flag, and exiting nowOther thread finished, bye!Как это работает
Этот пример очень похож на установку атрибута отсоединенного состояния за исключением того, что вы задаете вместо него способ планирования.
Отмена потока
Иногда требуется, чтобы один поток попросил другой завершиться досрочно способом, очень похожим на отправку ему сигнала. Сделать это можно с помощью потоков и параллельно с помощью обработки сигнала; у потоков появляется возможность изменить свое поведение, когда их просят завершиться.
Давайте сначала рассмотрим функцию для создания запроса на завершение потока.
<b>#include <pthread.h></b><b>int pthread_cancel(pthread_t thread);</b>Она достаточно проста: имея идентификатор потока, вы можете запросить его аннулирование. На приемном конце запроса на отмену все немного сложнее, но не слишком. Поток может установить состояние отмены с помощью функции
pthread_setcancelstate<b>#include <pthread.h></b><b>int pthread_setcancelstate(int state, int *oldstate);</b>Первый параметр равен либо значению
PHTREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLEoldstateNULLpthread_setcanceltype<b>#include <pthread.h></b><b>int pthread_setcanceltype(int type, int *oldtype);</b>Тип отмены может принимать одно из следующих значений:
PTHREAD_CANCEL_ASYNCHRONOUSPTHREAD_CANCEL_DEFERREDpthread_joinpthread_cond_waitpthread_cond_timedwaitpthread_testcancelsem_waitsigwaitМы не описываем все эти функции в данной главе, поскольку, как правило, не все они нужны. Когда они понадобятся, вы сможете найти дополнительную информацию на страницах интерактивного справочного руководства.
В соответствии со стандартом POSIX системные вызовы, способные задерживать выполнение, такие как
readwaitsleeppthread_testcancelПараметр
oldtypeNULLPTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DEFERREDВыполните упражнение 12.7.
Программа thread7.c — ещё один потомок программы thread1.с. На этот раз основной поток отправляет запрос на отмену потока, который он создал.
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>void *thread_function(void *arg);int main() { int res; pthread_t a_thread; void *thread_result; res = pthread_create(&a_thread, NULL, thread_function, NULL); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } sleep(3); printf("Canceling thread...n"); res = pthread_cancel(a_thread); if (res != 0) { perror("Thread cancelation failed"); exit(EXIT_FAILURE); } printf("Waiting for thread to finish...n"); res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("Thread join failed"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);}void *thread_function(void *arg) { int i, res; res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); if (res != 0) {
