Профиль программы 4.2
Имя программыprogram4-34. cc ;
ОписаниеДемонстрирует аннулирование потоков. Три потока имеют различные типы состояния аннулирования. Каждый поток выполняет цикл. Состояние и тип аннулирования определяет количество итераций цикла и то, будет ли цикл выполняться вообще. Основной поток определяет статус завершения каждого , рабочего потока.
Требуемая библиотека libpthread
Тр ебуемые заголовки
Инструкции по компиляции и компоновке программ
с++ -о program4-34 program4-34.сс -lpthread
Среда для тестированияSuSE Linux 7.1, gcc2.95.2.
И нс трукции по выполнению./program4-34
В функциях, определенных пользователем, используются точки аннулирования отмеченные обращением к функции pthread_testcancel(). Библиотека Pthread определяет в качестве точек аннулирования выполнение других функций. Эти функции блокируют вызывающий поток, а заблокированному потоку аннулирование не грозит. Вот эти функции библиотеки Pthread:
pthread_testcancel()
pthread_cond_wait()
pthread_timedwait()
pthread_join()
Если поток, пребывающий в состоянии отсроченного аннулирования, имеет ждущий запрос на аннулирование, то при вызове одной из перечисленных выше функций библиотеки Pthread будет инициирована процедура аннулирования. Некоторые из системных функций, претендующих на роль точек аннулирования, перечислены в табл. 4.6.
Таблица 4.6. Системные POSIX-функции, претендующие на роль точек аннулирования
accept() |
nanosleep() |
sem_wait() |
aio_suspend() |
open() |
send() |
clock_nanosleep() |
pause() |
sendmsg() |
close() |
poll() |
sendto() |
connect() |
pread() |
sigpause() |
creat() |
pthread_cond_timedwait() |
sigsuspend() |
fcntl() |
pthread_cond_wait() |
sigtimedwait() |
fsync() |
pthread_join() |
sigwait() |
getmsg() |
putmsg() |
sigwaitinfo() |
lockf() |
putpmsg() |
sleep() |
mq_receive() |
pwrite() |
system() |
mq_send() |
read() |
usleep() |
mq_timedreceive() |
readv() |
wait() |
mq_timedsend () |
recvfrom() |
waitpid() |
msgrcv() |
recvmsg() |
write() |
msgsnd() |
select() |
writev() |
msync() |
sem_timedwait() |
|
Несмотря на то что эти функции безопасны для отсроченного аннулирования потоков, они могут не быть таковыми для асинхронного аннулирования. Асинхронное аннулирование во время вызова библиотечной функции, которая не является асин хронно-безопасной, может привести к тому, что библиотечные данные останутся не в надлежащем состоянии. Библиотека выделит память от имени потока, и, когда поток будет аннулирован, продолжит удерживать «за собой» эту память. Для других библиотечных и системных функций, которые не являются безопасными для аннулирования (асинхронного или отсроченного), возможно, имеет смысл написать код, препятствующий завершению потока путем установки категорического запрета на аннулирование или использование отсроченного аннулирования до тех пор, пока эти функции не будут выполнены.
Очистка перед завершением
Поток, «позволивший» себя аннулировать, прежде чем завершиться, обычно должен выполнить некоторые заключительные действия. Так, нужно закрыть файлы, привести разделяемые данные в надлежащее состояние, снять блокировки или освободить занимаемые ресурсы. Библиотека Pthread определяет механизм поведения каждого потока «в последние минуты своей жизни». С каждым потоком связывается стек очистительно-восстановительных операций (cleanup stack), который содержит указатели на процедуры (или функции), предназначенные для выполнения во время аннулирования потока. Для того чтобы поместить в этот стек указатель на процедуру, предусмотрена функция pthread_cleanup_push ().
Синопсис
#include
void pthread_cleanup_push(void (*routine)(void *),void *arg);
void pthread cleanup pop(int execute);
Параметр routineпредставляет собой указатель на функцию, помещаемый в стек завершающих процедур. Параметр argсодержит аргумент, передаваемый этой routine-функции, которая вызывается при завершении потока с помощью функции pthread_exit(), когда поток «покоряется» запросу на аннулирование или явным образом вызывает функцию pthread__cleanup_pop() с ненулевым значением параметра execute.Функция, заданная параметром routine,не возвращает никакого значения.
Функция pthread_cleanup_pop()удаляет указатель routine-функции из вершины стека завершающих процедур вызывающего потока. Параметр executeможет принимать значение 1 или 0. Если его значение равно 1, поток выполняет routine-функцию, даже если он при этом и не завершается. Поток продолжает свое выполнение с инструкции, расположенной за вызовом функции pthread_cleanup_pop().Если значение параметра executeравно 0, указатель извлекается из вершины стека потока без выполнения routine-функции.
Читать дальше