8.5. Отмена выполнения потоков
8.5. Отмена выполнения потоков
Обсуждая листинг 8.4, мы обратили внимание на наличие проблемы, возникающей при отмене выполнения потока, заблокированного вызовом pthread_cond_wait. Выполнение потока может быть отменено в том случае, если какой-нибудь другой поток вызовет функцию pthread_cancel, единственным аргументом которой является идентификатор потока, выполнение которого должно быть отменено:
#include <pthread.h>
int pthread_cancel(pthread_t tid);
/* Возвращает 0 в случае успешного завершения, положительное значение Еххх –в случае ошибки */
Отмена выполнения может быть использована в том случае, если несколько потоков начинают работу над какой-то задачей (например, поиск записи в базе данных) и один из них завершает работу раньше всех остальных. Тогда он может отменить их выполнение. Другим примером является обнаружение ошибки одним из одновременно выполняющих задачу потоков, который затем может отменить выполнение и всех остальных.
Для обработки отмены выполнения поток может установить (push) или снять (pop) обработчик-очиститель (cleanup handler):
#include <pthread.h>
void pthread_cleanup_push(void (*function) (void *) void *arg);
void pthread_cleanup_pop(int execute);
Эти обработчики представляют собой обычные функции, которые вызываются:
? в случае отмены выполнения потока (другим потоком, вызвавшим pthread_ cancel);
? в случае добровольного завершения работы (вызовом pthread_exit или выходом из начальной функции потока).
Обработчики-очистители выполняют всю необходимую работу по восстановлению значений переменных, такую как разблокирование взаимных исключений и семафоров, которые могли быть заблокированы данным потоком.
Аргумент function представляет собой адрес вызываемой функции, а arg — ее единственный аргумент. Функция pthread_cleanup_pop всегда удаляет обработчик из верхушки стека и вызывает эту функцию, если значение execute отлично от 0.
ПРИМЕЧАНИЕ
Мы снова встретимся с проблемой отмены выполнения потоков в связи с листингом 15.26, где может произойти отмена выполнения сервера с дверьми при завершении работы клиента в процессе обработки вызванной им процедуры.
Данный текст является ознакомительным фрагментом.