std::unique_ptr的STL容器中find()的线程安全性
thread safety of find() from a STL container of std::unique_ptr
示例代码。
class Obj
{
public:
void doSome(void)
{
std::cout << "Hello World!" << std::endl;
}
};
std::unordered_map<int, std::unique_ptr<Obj>> map;
// insert -- done with single thread and before find()
map[123] = std::move( std::unique_ptr<Obj>(new Obj) );
// find -- run from multiple threads
auto search = map.find(123); // <=== (Q)
if (search != map.end())
{
search->second->doSome();
}
(Q(
如果有多个线程运行//find带有map.find(123(的部分,线程安全性如何?
将映射。find(123(始终在每个线程中找到对象?只要搜索->秒没有分配给其他人?
当多个线程访问同一个变量,并且其中至少有一个线程向该变量写入时,就会发生数据竞争。这里的情况并非如此,每个人都在读取相同的数据。没关系。不过,还有另一个问题在这段代码中没有得到解决:根据数据何时存储到映射对象中,一些线程可能看不到映射对象的更新版本。处理此同步问题的最简单方法是在创建任何读取器线程之前设置映射对象。
无序映射中的find()
和任何其他方法都不是线程安全的。如果一个执行线程可以调用find()
,而另一个线程可以调用任何修改它的无序映射方法,则会导致未定义的行为。
如果多个执行线程使用相同的键调用find()
,那么只要没有未定义的行为,所有执行线程都将获得该键的相同值。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- std::unique_ptr的STL容器中find()的线程安全性