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

Lock/CriticalSection vs volatile in c++ for visibility

本文关键字:volatile 可见性 vs CriticalSection 中的 Lock c++      更新时间:2023-10-16

我有一个地图,可以由多个线程更新。和一个临界区,保护对映射的读/写。

CCriticalSection mapCS;
map<string, string> mFileNameToInstance;

我每次访问map时都使用单锁。

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

我的问题是,

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

如果你总是访问map(包括读和写),那么你就不必像锁那样标记任何易失性,而是建立一个内存屏障,以便所有线程都可以看到任何更改。

然而,将地图标记为volatile可能不起作用。根据volatile的MSDN文档,关键字没有超过当前架构上使用一条指令可以复制的最大大小的影响。map级无疑属于这种情况。

另外,不要使用需要调用一些解锁函数的锁定机制。您的CSingleLock应该使用RAII模式在析构函数中进行解锁。

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