Скачиваний:
90
Добавлен:
12.05.2015
Размер:
913.92 Кб
Скачать

Поведение взаимных исключений различных типов

Тип взаимного исключения

Действия

Повторное запирание без отпирания

Попытка отпирания

другим потоком

Попытка отпирания незапертого взаимного исключения

PTHREAD_MUTEX_

NORMAL

Тупиковая ситуация

Не определено

Не определено

PTHREAD_MUTEX_

ERRORCHECK

Возврат кода ошибки

Возврат кода ошибки

Возврат кода ошибки

PTHREAD_MUTEX_

RECURSIVE

Допускается

Возврат кода ошибки

Возврат кода ошибки

PTHREAD_MUTEX_

DEFAULT

Не определено

Не определено

Не определено

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

15.5.2. Атрибуты условных переменных

Атрибуты условной переменной имеют тип pthread_condattr_t. Для их инициализации и разрушения существует пара функций, подобных соответствующим функциям для взаимных исключений.

#include<pthread.h>

int pthread_condattr_init (pthread_condattr_t *attr);

int pthread_condattr_destroy (pthread_condattr_t *attr);

/* обе функции возвращают 0 в случае успешного завершения, код ошибки – в случае неудачи */

Как и взаимные исключения, условные переменные имеют атрибут process_shared, который может принимать два значения:PTHREAD_PROCESS_PRIVATEилиPTHREAD_PROCESS_SHARED.

#include<pthread.h>

int pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared);

int pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared);

/* обе функции возвращают 0 в случае успешного завершения, код ошибки – в случае неудачи */

15.5.3. Атрибуты блокировок чтения-записи

Блокировки чтения-записи, подобно взаимным исключениям и условным переменным, также имеют атрибуты типа pthread_rwlockattr_t. Для инициализации структуры, содержащей атрибуты, следует воспользоваться двумя нижеследующими функциями:

#include<pthread.h>

int pthread_rwlockattr_init (pthread_rwlockattr_t *attr);

int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr);

/* обе функции возвращают 0 в случае успешного завершения, код ошибки – в случае неудачи */

После инициализации объекта типа pthread_rwlockattr_tдля установки или сброса отдельных атрибутов используются специальные функции. Единственный определенный в настоящее время атрибут –PTHREAD_PROCESS_SHARED, который указывает на то, что блокировка используется несколькими процессами, а не отдельными потоками одного процесса. Две приведенные ниже функции используются для получения и установки значения этого атрибута:

#include<pthread.h>

int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared);

int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);

/* обе функции возвращают 0 в случае успешного завершения, код ошибки – в случае неудачи */

Первая функция возвращает текущее значение в целом числе, на которое указывает аргумент pshared. Вторая функция устанавливает значение этого атрибута равнымpshared, которое может быть либоPTHREAD_PROCESS_PRIVATE, либоPTHREAD_PROCESS_SHARED.

Хотя стандарт Posix определяет всего один атрибут для блокировок чтения-записи, тем не менее, конкретные реализации могут добавлять собственные атрибуты.

Соседние файлы в папке Chapter.4