我有一张可以通过多个线程更新的地图。还有一个关键部分,用于保护对地图的读/写。
CCriticalSection mapCS;
map<string, string> mFileNameToInstance;
每次访问地图时都会使用单锁。
CSingleLock lock(&mapCS);
lock.Lock();
// perform whatever reads/write with the map.
mFileNameToInstance.insert("a", "b");
lock.Unlock();
我的问题是,
答案 0 :(得分:0)
您不需要声明映射volatile
CCriticalSection
处理您需要的所有并发阻塞要求。
答案 1 :(得分:0)
如果你总是访问地图(包括读取和写入),那么你不会像锁一样标记任何易失性,而是标记内存屏障,以便所有线程都能看到任何更改。
但是,将地图标记为volatile
可能无效。根据{{3}},关键字的效果不会超过可以使用一条指令在当前体系结构上复制的最大大小。 map
课程无疑将属于这种情况。
另外,请勿使用需要您调用某些解锁功能的锁定机制。您的CSingleLock
应使用MSDN documentation for volatile模式在其析构函数中解锁。