Чтение онлайн

на главную - закладки

Жанры

Параллельное и распределенное программирование на С++
Шрифт:

Функция pthread_cancel не возвра щ ает код ошибки [EINTR].

Примеры

Отсутствуют.

Замечания по использованию

Отсутствуют.

Логическое обоснование

Для отправки потоку уведо м ления об от м ене расс м атривалось два альтернативных варианта. Для одного предполагалось определить новый сигнал SIGCANCEL с соответствующей семантикой отмены, а для другого—

новую функцию pthread_cancel , которая бы приводила в действие процедуру отмены потока.

Преимущество варианта, прелусматривающего создание нового сигнала, состояло в том, что критерии его выдачи были бы во многом идентичны тем, которые использовались при попытке выдать любой другой сигнал, поэтому сигнальный механизм уведомления об отмене казался унифицированным. И в самом деле, во многих реализациях отмена потоков осуществляется посредством специального сигнала. Однако до сих пор не существовало ни одной сигнальной функции (за исключением функции pthread_kill), которую можно было бы использовать совместно с этим новым сигналом, поскольку поведение выдаваемого сигнала отмены должно было отличаться от поведения любого из уже определенных сигналов.

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

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

Будущие направления

Отсутствуют.

Смотри также

pthread_exit , pthread_cond_timedwait , pthread_join , pthread_setcancelstate , то м Base D e finitions стандарта IEEE Std 1003.1-2001, <pthread.h>.

Последовательность внесения изменений

Функция впервые реализована в выпуске Issue 5. Включена для согласования с расширение м POSIX Threads Ext e nsion.

Issue 6

Функция pthread_cancel от м ечена как часть опции Thr e ads.

pthread_cleanup_pop, pthread_cleanup_push

Имя

pthread_cleanup_pop, pthread_cleanup_push— функции создания обработчиков запроса об от м ене потоков.

Синопсис

THR

#include <pthread.h>

void pthread_cleanup_pop (int execute);

void pthread_cleanup_push (void (* routine) (void*),void *arg);

Описание

Функция pthread_cleanup_pop

используется для извлечения функции, расположенной в вершине стека вызываю щ его потока, предназначенного дл я выполнения подготовительных действий по аннулированию потока, и ее вызова (если пара м етр execute не равен нулю).

Функция pthread_cleanup_push позволяет поместить в стек вызывающего потока заданную функцию обработчика routine, предназначенного для выполнения подготовительных действий по аннулированию потока. Этот обработчик будет извлечен из соответствующего стека и вызван с аргументом arg при наличии следующих условий:

• поток существует (т.е. он вызывает функцию pthread_exit );

• поток действует в соответствии с запросом отмены;

• поток вызывает функцию pthread_cleanup_pop с ненулевым значением аргумента execute.

Эти функции можно реализовать как макросы. Приложение должно гарантировать, что они имеют форму инструкций и используются попарно в пределах одного и того же лексического контекста (чтобы макрос pthread_cleanup_push раскрывался в список лексем, начинающийся лексемой '{', а макрос pthread_cleanup_pop раскрывался в список лексем, завершающийся соответствующей лексемой '}').

Результат вызова функции longjmp или siglongjmp не определен, ec-ли имели место обращения к функции pthread_cleanup_push или pthread_cleanup_pop без соответствующего «парного» вызова по причине заполнения буфера переходов. Результат вызова функции longjmp или siglongjmp из обработчика, предназначенного для выполнения подготовительных действий по аннулированию потока, также не определен.

Возвращаемые значения

Функции pthread_cleanup_push и hread_cleanup_pop не возвра щ ают никакого значения.

Ошибки

Ошибки не определены.

Эти функции не возвращают код ошибки [EINTR].

Примеры

Следующий код представляет собой пример использования примитивов потока для реализации блокировки чтения-записи (с приоритетом для записи) с возможностью отмены.

typedef struct {

pthread_mutex_t lock; pthread_cond_t rcond, wcond;

int lock_count;

/* lock_count < 0 .. Удерживается записывающим потоком. */ /* lock_count > 0 .. Удерживается lock_count считывающими * потоками. */

/* lock_count = 0 .. Ничем не удерживается. */ int waiting_writers; /* Счетчик ожидающих записывающих

* потоков. */

} rwlock;

void

waiting_reader_cleanup (void, *arg) {

rwlock *1;

1 = (rwlock *) arg;

pthread_mutex_unlock (&l->lock);

}

void

lock_for_read (rwlock *1) {

pthread_mutex_lock (&l->lock);

pthread_cleanup_push (waiting_reader_cleanup, 1) ;

while ((l->lock_count < 0) && (l->waiting_writers ! = 0))

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4