Рассмотрим, например, взаимное исключение. Аргумент mptr должен указывать на переменную типа pthread_mutex_t, для которой должна быть уже выделена память, и тогда функция pthread_mutex_init инициализирует это взаимное исключение. Значение типа pthread_mutexattr_t, на которое указывает второй аргумент функции pthread_mutex_init(
Атрибуты взаимного исключения имеют тип pthread_mutexattr_t, а условной переменной — pthread_condattr_t, и инициализируются и уничтожаются с помощью следующих функций:
#include
int pthread_mutexattr_init(pthread_mutexattr_t *
int pthread_mutexattr_destroy(pthread_mutexattr_t *
int pthread_condattr_init(pthread_condattr_t *
int pthread_condattr_destroy(pthread_condattr_t *
/* Все четыре функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
После инициализации атрибутов взаимного исключения или условной переменной для включения или выключения отдельных атрибутов используются отдельные функции. Например, один из атрибутов позволяет использовать данное взаимное исключение или условную переменную нескольким процессам (а не потокам одного процесса). Этот атрибут мы будем использовать в последующих главах. Его значение можно узнать и изменить с помощью следующих функций:
#include
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *
int pthread_mutexattr_setpshared(pthread_mutexattr_t *
int pthread_condattr_getpshared(const pthread_condattr_t *
int pthread_condattr_setpshared(pthread_condattr_t *
/* Все четыре функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Две функции get возвращают текущее значение атрибута через целое, на которое указывает valptr, а две функции set устанавливают значение атрибута равным значению value. Значение value может быть либо PTHREAD_PROCESS_PRIVATE, либо PTHREAD_PROCESS_SHARED. Последнее также называется атрибутом совместного использования процессами.
ПРИМЕЧАНИЕ
Эта возможность поддерживается только в том случае, если константа _POSIX_THREAD_PROCESS_SHARED определена в заголовочном файле
Нижеследующий фрагмент кода показывает, как нужно инициализировать взаимное исключение, чтобы его можно было совместно использовать нескольким процессам:
pthread_mutex_t *mptr; /* указатель на взаимное исключение, находящееся в разделяемой памяти */
pthread_mutexattr_t mattr; /* атрибуты взаимного исключения */
…
mptr = /* некоторое значение, указывающее на разделяемую память */
Pthread_mutexattr_init(&mattr);
#ifdef _POSIX_THREAD_PROCESS_SHARED
Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
#else
# error Эта реализация не поддерживает _POSIX_THREAD_PROCESS_SHARED
#endif
Pthread_mutex_init(mptr, &mattr);
Мы объявляем переменную mattr типа pthread_mutexattr_t, инициализируем ее значениями атрибутов по умолчанию, а затем устанавливаем атрибут PTHREAD_PROCESS_SHARED, позволяющий совместно использовать взаимное исключение нескольким процессам. Затем pthread_mutex_init инициализирует само исключение с соответствующими атрибутами. Количество разделяемой памяти, которое следует выделить под взаимное исключение, равно sizeof(pthread_mutex_t).