繁体   English   中英

Lock / CriticalSection与可变在C ++中的可见性

[英]Lock/CriticalSection vs volatile in c++ for visibility

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

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对所有其他线程的可见性还是需要可变的?

您无需将映射声明为volatileCCriticalSection处理所需的所有并发阻止要求。

如果您始终访问映射(读写),则不会像锁那样标记任何易失性,而是会增加内存屏障,以便所有线程都可以看到任何更改。

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

另外,请勿使用要求您调用某些解锁功能的锁定机制。 您的CSingleLock应该使用RAII模式在其析构函数中进行解锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM