thread 线程安全 unordered_map

C++11:基于std::unordered_map和共享锁构建线程安全的map

https://blog.youkuaiyun.com/10km/article/details/52072061

https://blog.youkuaiyun.com/10km/article/details/52067929

 

程序中经常需要缓存一些数据, 但是std::map 不是线程安全的

https://blog.youkuaiyun.com/chen802311/article/details/76793719

 

https://blog.youkuaiyun.com/10km/article/details/49641691

 

C++11中std::mutex的使用https://blog.youkuaiyun.com/fengbingchun/article/details/73521630

 

C++11 mutex方便的自解锁lock_guard

https://blog.youkuaiyun.com/xiaoyafang123/article/details/54137611

 

C++11 unordered_map 无序容器的使用

https://blog.youkuaiyun.com/haolipengzhanshen/article/details/51970348

 

https://blog.youkuaiyun.com/zengyubao1/article/details/80834628

C++ 11 std::unordered_map高级用法

https://blog.youkuaiyun.com/fcku_88/article/details/88353431

C++ std::unordered_map 用法详解

 

 

 

 

 

 

 

 

### C++ 中多线程环境下访问 `unordered_map` 是否需要加锁 在 C++ 的多线程环境中,`std::unordered_map` 并不是线程安全的容器。这意味着如果多个线程同时对同一个 `std::unordered_map` 实例进行读写操作,则可能会引发数据竞争或未定义行为[^1]。 当只有一个线程执行修改操作(如插入、删除),而其他线程仅执行只读操作时,理论上不需要额外的同步机制来保护 `std::unordered_map` 的一致性。然而,在实际应用中,为了防止潜在的竞争条件以及确保程序的行为可预测,通常建议使用某种形式的同步控制措施,即使是在这种情况下也应如此[^2]。 对于涉及并发修改的情况——即存在至少两个线程可能同时尝试改变同一份 `std::unordered_map` 数据结构的内容时,必须采取适当的锁定策略或其他同步技术以保障其安全性。常见的做法包括但不限于: - 使用标准库提供的互斥量 (`std::mutex`) 配合 RAII 模式的工具类如 `std::lock_guard<std::mutex>` 来自动管理资源生命周期内的上锁与解锁过程。 ```cpp #include <iostream> #include <thread> #include <vector> #include <unordered_map> #include <mutex> std::unordered_map<int, int> sharedMap; std::mutex mtx; void insertElement(int key, int value){ std::lock_guard<std::mutex> lock(mtx); // 自动获取并释放锁 sharedMap[key] = value; } int main(){ std::vector<std::thread> threads; for (int i=0;i<10;++i){ threads.emplace_back(insertElement,i,i*2); } for(auto& th : threads){ if(th.joinable()) th.join(); } for(const auto &pair : sharedMap){ std::cout << pair.first << ": " << pair.second << "\n"; } } ``` 另一种方式则是通过引入更高级别的抽象概念比如读者写者模式下的共享互斥体(`std::shared_mutex`) ,允许更高的并发度从而提升整体效率[^3]: ```cpp #include <iostream> #include <thread> #include <vector> #include <unordered_map> #include <shared_mutex> std::unordered_map<int,int> data; std::shared_mutex rw_mtx; // 只读操作 void readData(int key){ std::shared_lock<std::shared_mutex> lock(rw_mtx); if(data.find(key)!=data.end()){ std::cout<<"Read: "<<key<<": "<<data.at(key)<<'\n'; }else{ std::cout<<"Key not found.\n"; } } // 修改操作 void writeData(int key, int val){ std::unique_lock<std::shared_mutex> lock(rw_mutex); data[key]=val; std::cout<<"Write: "<<key<<": "<<val<<"\n"; } ``` 综上所述,在多线程场景下访问 `std::unordered_map` 时确实有必要实施相应的同步手段来规避风险;具体采用哪种方案取决于应用场景的具体需求及性能考量等因素.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值