正在创建 unique_ptr 线程安全

问题描述

std::array<unique_ptr<SomeClass>,1000> globalArray;

void foo(int index)
{
   globalArray[index] = make_unique<SomeClass>();
//or globalArray[index] = std::unique_ptr<SomeClass> p(new SomeClass); ?
}

考虑到这里我确定传递给foo的索引,它们不会重复并且不会超过globalArray的容量,所以不需要检查它,这段代码会是线程安全?

解决方法

如果有 2 个或更多线程访问同一内存,其中至少有 1 次访问是写操作,则存在竞争条件。在您的示例中,如果您确定索引不同并且没有 2 个线程尝试写入相同的内存,则它是安全的。从不同线程修改同一数组的不同元素是安全的,即使它可能导致 false-sharing


我强烈推荐 this Scott Meyers 的演讲,其中更详细地介绍了您正在做什么以及虚假分享与此相关的内容。

,

正在创建 unique_ptr 线程安全

从指针创建 std::unique_ptr 是线程安全的。此外,访问数组的唯一索引是线程安全的。

虽然构造函数通常是线程安全的,但我们无法知道 SomeClass 的默认构造函数是否安全而不知道它的定义。

此外,稍后从其他线程访问创建的指针将需要同步。

请注意,从不同线程写入指针数组的相邻索引是一种错误共享可能会影响性能的情况。