正在创建 unique_ptr 线程安全

Is creating unique_ptr thread safe

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) 的演讲,其中更详细地说明了您正在做的事情以及虚假分享与此相关的内容。

Is creating unique_ptr thread safe

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

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

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

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