Lock / CriticalSection vs c ++中的volatile用于可见性

时间:2014-03-24 18:30:38

标签: c++ multithreading mfc

我有一张可以通过多个线程更新的地图。还有一个关键部分,用于保护对地图的读/写。

CCriticalSection mapCS;
map<string, string> mFileNameToInstance;

每次访问地图时都会使用单锁。

CSingleLock lock(&mapCS);  
lock.Lock();
// perform whatever reads/write with the map.
mFileNameToInstance.insert("a", "b");
lock.Unlock();

我的问题是,

  • 是否足以保证mFileNameToInstance对所有其他线程的可见性,或者它是否需要是volatile?

2 个答案:

答案 0 :(得分:0)

您不需要声明映射volatile CCriticalSection处理您需要的所有并发阻塞要求。

答案 1 :(得分:0)

如果你总是访问地图(包括读取和写入),那么你不会像锁一样标记任何易失性,而是标记内存屏障,以便所有线程都能看到任何更改。

但是,将地图标记为volatile可能无效。根据{{​​3}},关键字的效果不会超过可以使用一条指令在当前体系结构上复制的最大大小。 map课程无疑将属于这种情况。

另外,请勿使用需要您调用某些解锁功能的锁定机制。您的CSingleLock应使用MSDN documentation for volatile模式在其析构函数中解锁。