【问题标题】:Upgradeable read/write lock Win32可升级读/写锁Win32
【发布时间】:2010-12-23 06:04:31
【问题描述】:

我正在寻找具有 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 的解决方案是可能的?

【问题讨论】:

    标签: c++ c winapi locking pthreads


    【解决方案1】:

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

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

    我不建议你自己写,这是一件很棘手的事情,而且很难彻底测试。

    【讨论】:

    • boost::shared_mutex 的 win32 实现看起来很有希望。 pthread 实现并不那么漂亮(它比我需要的要多,因此他们使用的方法可能不如 pthread_rwlock_ 具有非标准升级行为的效率..)。我试试看……
    • 嗯,它很完美,在阅读文档并尝试之后,现在一切都说得通了 :-)
    【解决方案2】:

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

    此外,考虑使用OpenMP 代替锁:编译器扩展提供可移植 临界区、内核线程模型、任务等等! MS C++ 支持该技术以及 Linux 中的 g++。

    干杯! :)

    【讨论】:

    • 其实pthread就是POSIX线程的意思。如果您下载必要的服务,Windows 可以兼容 POSIX
    • 你是对的,但它们通常被称为“便携式”,因为它们是。 :)
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多