C++ 可升级读/写锁Win32

C++ 可升级读/写锁Win32,c++,c,winapi,locking,pthreads,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_rwlo

我正在寻找一个具有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();
lock.rdlock();
阅读
如果(某些条件){
if(lock.tryupgrade()){
写
lock.unlock();
返回;
}否则{
lock.unlock();
// 
lock.wrlock();
如果(某些条件){//so,则需要重新检查
写
}
lock.unlock();
返回;
}
}
阅读
lock.unlock();
编辑:赏金:


我仍在搜索中,但想添加一些限制:它只在进程内使用(因此基于关键部分是可以的,WIN32互斥不可以),并且应该是纯WIN32 API(没有MFC、ATL等)。获取读锁应该是快速的(因此,获取读锁不应该进入其快速路径中的关键部分)。也许可以使用基于InterlocatedIncrement的解决方案?

pthread库是一个“可移植线程”库。这意味着它在windows上也受支持;)看一看:

另外,考虑使用替代锁:编译器扩展提供可移植的关键部分、KNES线程模型、任务以及更多!C++在Linux上支持这种技术以及G++。


干杯!:)

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


我不建议您自己编写,这是一件棘手的事情,很难进行彻底的测试。

事实上,pthread意味着POSIX线程。如果您下载了必要的服务,Windows可以兼容POSIX。您是对的,但它们通常被称为“便携式”,因为它们是:
boost::shared_mutex
的win32实现看起来很有希望。pthread实现不是很漂亮(它的功能超出了我的需要,因此他们使用的方法可能没有pthread_rwlock____)的非标准升级行为那么有效..)。我将尝试一下……好吧,它是完美的,在阅读文档并尝试之后,现在一切都变得有意义了:-)