Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++中易失性的可见性_C++_Multithreading_Mfc - Fatal编程技术网

锁定/临界段与C++中易失性的可见性

锁定/临界段与C++中易失性的可见性,c++,multithreading,mfc,C++,Multithreading,Mfc,我有一个地图,可以通过多线程更新。以及保护对映射的读/写操作的关键部分 CCriticalSection mapCS; map<string, string> mFileNameToInstance; 我的问题是, 它是否足以保证mFileNameToInstance对所有其他线程的可见性,或者它是否需要是易失性的? 您不需要将映射声明为易失性—CCriticalSection将处理您需要的所有并发阻塞要求。如果您总是在读写时访问映射,那么您就不会像锁那样标记任何易失性,而是设置一

我有一个地图,可以通过多线程更新。以及保护对映射的读/写操作的关键部分

CCriticalSection mapCS;
map<string, string> mFileNameToInstance;
我的问题是,

它是否足以保证mFileNameToInstance对所有其他线程的可见性,或者它是否需要是易失性的?
您不需要将映射声明为易失性—CCriticalSection将处理您需要的所有并发阻塞要求。

如果您总是在读写时访问映射,那么您就不会像锁那样标记任何易失性,而是设置一个内存屏障,以便所有线程都可以看到任何更改

但是,将地图标记为volatile可能不起作用。根据定义,关键字没有超过当前体系结构上使用一条指令可以复制的最大大小的效果。map类无疑将属于这种情况


另外,不要使用需要调用某些解锁功能的锁定机制。您的CSingelock应该使用该模式在其析构函数中解锁。

如果您有可用的C++11,只需使用volatile关键字来帮助编译器整理您在多线程环境中可以使用或不能使用的内容即可?这就足够了,锁包括一个内存屏障。好的。在这种情况下,我们是否也需要同步读和锁?读卡器也需要锁。在一个写入程序执行其操作的过程中,在操作的所有部分完成之前,可能存在中间状态。此时读取可能会产生无效数据。InterlockedExchange是一个完整的内存屏障,使用volatile有什么好处?@JonathanWakely:InterlockedExchange需要volatile,所以我想好处是编译时不发出警告:-@AdrianMcCarthy,不是根据,你把can accept和requires混淆了吗?老实说,我没有尝试过推动联锁同步功能的“volatile”隐含要求,因为我们都知道这很难测试。如果volatile阻止编译器积极优化对变量的访问,并且互锁函数在签名中显示“volatile”,那么我将使用volatile。你们中有人可以编译最终答案吗?所以我知道我们不需要CriticalSection的volatile。谢谢。这引起了我另一个问题-
CSingleLock lock(&mapCS);  
lock.Lock();
// perform whatever reads/write with the map.
mFileNameToInstance.insert("a", "b");
lock.Unlock();