Обновляемая блокировка чтения / записи Win32 - PullRequest
4 голосов
/ 04 декабря 2009

Я в поиске обновляемой блокировки чтения-записи для 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?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2009

Класс boost shared_mutex поддерживает блокировки чтения (общие) и записи (уникальные) и временные обновления от общих до уникальных блокировок.

Пример для повышения shared_mutex (многократное чтение / одна запись)?

Я не рекомендую писать свои собственные, это сложно сделать правильно и сложно тщательно проверить.

0 голосов
/ 15 декабря 2009

Библиотека pthread - это библиотека 'Portable Threads'. Это означает, что он также поддерживается в Windows;) Посмотрите: Pthreads-w32 .

Кроме того, рассмотрите возможность использования OpenMP вместо блокировок: расширение компилятора обеспечивает переносные критические секции, модель многопоточности Kernes, задачи и многое другое! MS C ++ поддерживает эту технологию, а также g ++ в Linux.

Ура! :)

...