在 C++ 标准库中,`std::map` 是一个单线程容器,不直接支持并发读写操作。如果在多线程环境中需要对 `std::map` 进行读写操作,你需要手动添加互斥锁来保护并发访问,以防止数据竞争和不一致性。
然而,C++11 引入了标准库的并发支持,其中包括了 `std::shared_mutex`(共享互斥锁)和 `std::map` 结合使用的方法。`std::shared_mutex` 支持读写分离的锁策略,允许多个线程并发地读取数据,但在写入数据时会互斥锁定。
以下是一个使用 `std::shared_mutex` 来实现读写安全的 `std::map` 的示例:
#include <iostream>
#include <map>
#include <shared_mutex>
#include <thread>
std::map<int, int> myMap;
std::shared_mutex mapMutex;
void writeMap(int key, int value) {
std::unique_lock<std::shared_mutex> lock(mapMutex);
myMap[key] = value;
}
int readMap(int key) {
std::shared_lock<std::shared_mutex> lock(mapMutex);
auto it = myMap.find(key);
if (it != myMap.end()) {
return it->second;
} else {
return -1; // 返回默认值,表示未找到
}
}
int main() {
std::thread writer(writeMap, 1, 100);
std::thread reader(readMap, 1);
writer.join();
reader.join();
return 0;
在上述示例中,我们使用 `std::shared_mutex` 来保护对 `myMap` 的并发访问。`writeMap` 函数使用 `std::unique_lock` 来获得独占的写入访问权限,而 `readMap` 函数使用 `std::shared_lock` 来获得共享的读取访问权限。这样,在写入数据时会阻止其他线程的任何访问,而在读取数据时可以允许多个线程同时访问。
需要注意的是,C++17 引入了 `std::shared_mutex`,如果你的编译环境支持 C++17,可以使用上述示例。如果不支持,你可以考虑使用第三方的并发容器库,如 `tbb::concurrent_hash_map`,它为多线程环境下的并发读写提供了更好的性能支持。