我正在使用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的解决方案是可能的吗?
答案 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 ++。
干杯! :)