Параллельное и распределенное программирование на С++
Шрифт:
pthread_join(Threads[Count],&Status); if(Status == PTHREAD_CANCELED){
cout << «Поток» << Count << " аннулирован.» << endl;
}
else{
cout « «Поток» << Count << " продолжает выполнение.» << endl;
}
}
return (0) ;
}
Управляющий поток в программе 4.4 сначала создает три рабочих потока, затем делает запрос на аннулирование каждого из них. Управляющий поток для каждого рабочего потока вызывает функцию pthread_join. Эта функция завершается успешно даже тогда, когда она пытается присоединить поток, который уже завершен, функция присоединения в этом случае просто считывает статус завершения завершенного
Профиль программы 4.2
Имя программы program4-34. cc ;
Описание Демонстрирует аннулирование потоков. Три потока имеют различные типы состояния аннулирования. Каждый поток выполняет цикл. Состояние и тип аннулирования определяет количество итераций цикла и то, будет ли цикл выполняться вообще. Основной поток определяет статус завершения каждого , рабочего потока.
Требуемая библиотека libpthread
Тр ебуемые заголовки <pthread.h> <iostream>
Инструкции по компиляции и компоновке программ
с++ -о program4-34 program4-34.сс – lpthread
Среда для тестирования SuSE Linux 7.1, gcc 2.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 <pthread.h>
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– функции.