c – 可升级的读/写锁Win32

我正在使用pthreads rwlock的行为搜索win32的可升级读写锁,其中读锁可以升级和降级.

我想要的是:

pthread_rwlock_rdlock( &lock );
...read...
if( some condition ) {
    pthread_rwlock_wrlock( &lock );
    ...write...
    pthread_rwlock_unlock( &lock );
}
...read...
pthread_rwlock_unlock( &lock );

posix不需要升级行为,但它适用于Mac上的linux.

目前,我有一个可升级的工作实现(基于事件,信号量和关键部分),但是当读者处于活动状态时升级可能会失败.如果失败则读取解锁重新检查写入锁定是必要的.

是)我有的:

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的解决方案是可能的?

最佳答案 boost shared_mutex类支持读取器(共享)和编写器(唯一)锁以及从共享锁到唯一锁的临时升级.

Example for boost shared_mutex (multiple reads/one write)?

我不建议你自己编写,要做到正确而且难以彻底测试是一件棘手的事情.

点赞