可升级的读/写锁Win32

时间:2009-12-04 13:44:14

标签: c++ c winapi locking pthreads

我正在使用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的解决方案是可能的吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

pthread库是一个'Portable Threads'库。这意味着它也支持Windows;)看看:Pthreads-w32

此外,请考虑使用OpenMP而不是锁:编译器扩展提供便携式关键部分,kernes线程模型,任务等等! MS C ++支持这项技术以及Linux中的g ++。

干杯! :)