我正在寻找一个可升级的读写锁,用于执行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所需要的升级行为,但它可以在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的解决方案是可能的?
'boost :: shared_mutex'的win32实现看起来很有希望。 pthread实现不太漂亮(它比我需要的要多,所以它们使用的方法可能不像pthread_rwlock_那样有非标准的升级行为。)。我会试一试... – Frunsi 2009-12-15 22:18:08
嗯,它的完美,阅读完文档并试用后,现在一切都变得有意义了:-) – Frunsi 2009-12-16 03:46:43