c++中的Lock/CriticalSection vs volatile的可见性
Lock/CriticalSection vs volatile in c++ for visibility
我有一个地图,可以由多个线程更新。和一个临界区,保护对映射的读/写。
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
处理您需要的所有并发阻塞需求。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 未直接继承的基模板类成员的可见性
- 从shm_open() mmap()更改对共享内存的可见性
- c++中的Lock/CriticalSection vs volatile的可见性