Существует по крайней мере один метод реализации, который можно использовать для сокращения расходов в период блокирования на проверку того, имеет ли мьютекс нестандартные атрибуты. Один такой метод заключается в том, чтобы предварительно заблокировать любые мьютексы, которые инициализированы нестандартными атрибутами. Любая попытка позже заблокировать такой мьютекс заставит реализацию перейти на «медленный путь», как если бы мьютекс был недоступен; затем реализация могла бы «по-настоящему» заблокировать «нестандартный» мьютекс. Базовая операция разблокировки более сложна, поскольку реализация никогда в действительности не желает освобождать мьютекс, который был предварительно заблокирован. Это показывает, что (в зависимости от оборудования) существует необходимость применения оптимизаций для более эффективной обработки часто используемых атрибутов мьютекса.
Использование общей памяти и синхронизация процессов
Существование функций распределения памяти в этом томе стандарта IEEE Std 1003.1-2001 дает приложению возможность выделять память объектам синхронизации из того раздела, который доступен многим процессам (а следовательно, и потокам многих процессов).
Чтобы реализовать такую возможность при эффективной поддержке обычного (т.е. однопроцессорного) случая, был определен атрибут
Если реализация по
Для того чтобы объекты синхронизации по у
/* sem.h */
struct semaphore {
pthread_mutex_t lock;
pthread_cond_t nonzero;
unsigned count;
};
typedef struct semaphore semaphore_t;
semaphore_t *semaphore_create (char *semaphore_name);
semaphore_t *semaphore_open (char *semaphore_name);
void semaphore_post (semaphore_t *semap);
void semaphore_wait (semaphore_t *semap); void semaphore_close (semaphore_t *semap);
/* sem.c */
#include
semaphore_t *
semaphore_create (char * semaphore_name) t
int fd;
semaphore_t * semap; pthread_mutexattr_t psharedm;
pthread_condattr_t psharedc;
fd = open(semaphore_name, O_RDWR | O_CREAT | O_EXCL, Оббб); if (fd <0)
return (NULL); (void) ftruncate (fd, sizeof (semaphore_t)); (void) pthread_mutexattr_init (&psharedm); (void) pthread_mutexattr_setpshared(&psharedm,
PTHREAD_PROCESS_SHARED) ;
(void) pthread_condattr_init (&psharedc); (void) pthread_condattr_setpshared (&psharedc
PTHREAD_PROCESS_SHARED);
semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t),
PR0T_READ | PROT_WRITE, MAP_SHARED, fd, О);
close (fd);
(void) pthread_mutex_init (&semap->lock, &psharedm);
(void) pthread_cond_init (&semap->nonzero, &psharedc); semap->count = 0; return (semap);
}
semaphore_t *