8-9 Счетчик rw_nwaitreaders уменьшается, а затем разблокируется взаимное исключение. Это состояние, которое должно быть восстановлено при отмене потока. Аналогично мы исправим текст функции pthread_rwlock_wrlock из листинга 8.6. Сначала добавим две новые строки рядом с вызовом pthread_cond_wait: В листинге 8.11 приведен текст функции rwlock_cancelwrwait, являющейся обработчиком-очистителем для запроса блокировки на запись.Листинг 8.10. Функция rwlock_cancelrdwait: обработчик для блокировки чтения
//my_rwlock_cancel/pthread_rwlock_rdlock.с
3 static void
4 rwlock_cancelrdwait(void *arg)
5 {
6 pthread_rwlock_t *rw;
7 rw = arg;
8 rw->rw_nwaitreaders--;
9 pthread_mutex_unlock(&rw->rw_mutex);
10 }
rw->rw_nwaitreaders++;
+ pthread_cleanup_push(rwlock_cancelrwrwait, (void*) rw);
result = pthread_cond_wait(&rw->rw_condwriters, &rw->rw_mutex);
+ pthread_cleanup_pop(0);
rw->rw_nwaitreaders--;