Листинг 8.5. Функция pthread_rwlock_tryrdlock: попытка заблокировать ресурс для чтения
//my_rwlock/pthread_rwlock_tryrdlock.с
1 #include "unpipc.h"
2 #include "pthread_rwlock.h"
3 int
4 pthread_rwlock_tryrdlock(pthread_rwlock_t *rw)
5 {
6 int result;
7 if (rw->rwjnagic != RW_MAGIC)
8 return(EINVAL);
9 if ((result = pthread_mutex_lock(&rw->rw_mutex)) != 0)
10 return(result);
11 if (rw->rw_refcount < 0 || rw->rw_nwaitwriters > 0)
12 result = EBUSY; /* блокировка установлена пишущим потоком или есть пишущие потоки, ожидающие освобождения ресурса */
13 else
14 rw->rw_refcount++; /* увеличение количества блокировок на чтение */
15 pthread_mutex_unlock(&rw->rw_mutex);
16 return(result);
17 }
11-14 Если блокировка в данный момент установлена на запись или есть процессы, ожидающие возможности установить ее на запись, возвращается ошибка с кодом EBUSY. В противном случае мы устанавливаем блокировку, увеличивая значение счетчика rw_refcount.