我正在使用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)?
我不建议你自己编写,要做到正确而且难以彻底测试是一件棘手的事情.