Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用AcquireSRWLock的安全线程映射/哈希表_C++_Multithreading_Visual C++_Readerwriterlockslim_Readerwriterlock - Fatal编程技术网

C++ 使用AcquireSRWLock的安全线程映射/哈希表

C++ 使用AcquireSRWLock的安全线程映射/哈希表,c++,multithreading,visual-c++,readerwriterlockslim,readerwriterlock,C++,Multithreading,Visual C++,Readerwriterlockslim,Readerwriterlock,我使用AcquireSRWLockShared和AcquireSRWLockExclusive Windows API为非线程安全映射提供了一个瘦包装器。本质上,与查找相关的方法采用读锁,而与“set”相关的方法采用写锁——非常简单,直截了当 问题是:我正在重构旧代码,其中一个要求是调用方需要能够在“收集级别”锁定此映射,然后对其进行不同的调用——可以说是“在一个事务下” 问题是,如果我要获取一个写锁并保持它,那么如果我要进行查找——查找方法试图获取一个读锁,它将失败或阻塞。看起来我把两种不同的

我使用AcquireSRWLockShared和AcquireSRWLockExclusive Windows API为非线程安全映射提供了一个瘦包装器。本质上,与查找相关的方法采用读锁,而与“set”相关的方法采用写锁——非常简单,直截了当

问题是:我正在重构旧代码,其中一个要求是调用方需要能够在“收集级别”锁定此映射,然后对其进行不同的调用——可以说是“在一个事务下”

问题是,如果我要获取一个写锁并保持它,那么如果我要进行查找——查找方法试图获取一个读锁,它将失败或阻塞。看起来我把两种不同的方法塞进了一个篮筐,但这一切都没有发生


我能想到的唯一解决办法是,我应该使用一个简单的临界区,它不区分读者和作者——同一个线程可以多次进入同一临界区。那会很糟糕,因为我真的很想获得单写器/多读器的性能。有什么想法吗?

是的,你需要一个互斥器。当您承诺需要“交易”时,列车离开了车站。也许你只需要另一个集合,你将与现有的一个集合合并,从这个问题很难判断这是否有效。我正在尝试改进已有20年历史的代码库--使用我得到的