2009-12-04 78 views
4

我正在寻找一个可升级的读写锁,用于执行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的解决方案是可能的?

回答

2

该提升shared_mutex类支持读取器(共享)和写入器(唯一)锁和临时从共享锁升级到唯一锁。

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

我不建议写你自己的,这是一个棘手的事情得到正确且难以进行彻底的测试。

+0

'boost :: shared_mutex'的win32实现看起来很有希望。 pthread实现不太漂亮(它比我需要的要多,所以它们使用的方法可能不像pthread_rwlock_那样有非标准的升级行为。)。我会试一试... – Frunsi 2009-12-15 22:18:08

+0

嗯,它的完美,阅读完文档并试用后,现在一切都变得有意义了:-) – Frunsi 2009-12-16 03:46:43

0

pthread库是一个'可移植的线程'库。这意味着它也支持在Windows上;)看看:Pthreads-w32

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

干杯! :)

+1

实际上,pthread表示POSIX线程。如果你下载了必要的服务,Windows可以符合POSIX – 2009-12-15 20:38:46

+0

你是对的,但是他们通常被称为“便携式”,因为它们是。 :) – kolypto 2009-12-15 23:22:14