8-9 Счетчик rw_nwaitwriters уменьшается, и взаимное исключение разблокируется. При запуске нашей тестовой программы из листинга 8.9 с этими новыми функциями мы получим правильные результаты: Теперь три счетчика имеют правильные значения, первый поток возвращается из вызова pthread_rwlock_unlock, а функция pthread_rwlock_destroy не возвращает ошибку EBUSY. ПРИМЕЧАНИЕ Этот раздел представляет собой обзор вопросов, связанных с отменой выполнения потоков. Для более детального изучения этих проблем можно обратиться, например, к разделу 5.3 книги [3].Листинг 8.11. Функция rwlock_cancelwrwait: обработчик для блокировки записи
//my_rwlock_cancel/pthread_rwlock_wrlock.с
3 static void
4 rwlock_cancelwrwait(void *arg)
5 {
6 pthread_rwlock_t *rw;
7 rw = arg;
8 rw->rw_nwaitwriters––;
9 pthread_mutex_unlock(&rw->rw_mutex);
10 }
solaris %testcancel
thread1() got a read lock
thread2() trying to obtain a write lock
rw_refcount = 0, rw_nwaitreaders = 0, rw_nwaitwriters = 0