Я в поиске обновляемой блокировки чтения-записи для win32 с поведением pthreads rwlock, где блокировка чтения может быть повышена или понижена.
Что я хочу:
pthread_rwlock_rdlock( &lock );
...read...
if( some condition ) {
pthread_rwlock_wrlock( &lock );
...write...
pthread_rwlock_unlock( &lock );
}
...read...
pthread_rwlock_unlock( &lock );
Режим обновления не требуется для posix, но он работает на linux на mac.
В настоящее время у меня есть работающая реализация (основанная на событии, семафоре и критическом разделе), которую можно обновить, но обновление может завершиться неудачно, когда читатели активны. В случае сбоя чтения требуется разблокировка + перепроверка + блокировка записи.
Что у меня есть:
lock.rdlock();
...read...
if( some condition ) {
if( lock.tryupgrade() ) {
...write...
lock.unlock();
return;
} else {
lock.unlock();
// <- here, other threads may alter the condition ->
lock.wrlock();
if( some condition ) { // so, re-check required
...write...
}
lock.unlock();
return;
}
}
...read...
lock.unlock();
РЕДАКТИРОВАТЬ: Щедрость:
Я все еще нахожусь в поиске, но хочу добавить некоторые ограничения: он используется только для внутрипроцессного (поэтому на основе критических секций все в порядке, мьютексы WIN32 не в порядке), и это должен быть чистый WIN32 API (без MFC , ATL и т. Д.). Получение блокировки чтения должно быть быстрым (таким образом, получение блокировки чтения не должно входить в критическую секцию в его быстром пути). Может быть, возможно решение на основе InterlockedIncrement?