是创建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的容量,所以不需要检查它,这段代码是线程安全的吗?

创建unique_ptr线程安全吗

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

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

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

请注意,对来自不同线程的指针数组写入相邻索引可能会导致错误共享,从而影响性能。

如果两个或两个以上的线程访问同一内存,并且至少有一个访问是写的,则存在竞争条件。在您的示例中,如果您确定索引是不同的,并且没有两个线程试图写入相同的内存,则它是安全的。修改来自不同线程的同一数组的不同元素是安全的,即使它可能导致错误共享。


我强烈推荐Scott Meyers的演讲,他更详细地介绍了你在做什么,以及虚假分享是如何与之相关的。

最新更新