【问题标题】:Is creating unique_ptr thread safe正在创建 unique_ptr 线程安全
【发布时间】:2021-06-04 00:36:03
【问题描述】:
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 的容量,所以不需要检查它,这段代码是否是线程-安全吗?

【问题讨论】:

  • SomeClass 是否访问一些全局/并发变量?
  • 这能回答你的问题吗? Is unique_ptr thread safe?
  • 创建 anything 是“线程安全的”,因为一次不能由多个线程创建单个对象。但是如果你把它的地址附加到一个指针上,一次只能有一个线程访问那个指针。
  • 您需要考虑全局。我想你也在某个地方访问你分配给数组中元素的唯一指针。这些访问当然必须与创建元素同步

标签: c++ multithreading c++11 thread-safety unique-ptr


【解决方案1】:

正在创建 unique_ptr 线程安全

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

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

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

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

【讨论】:

    【解决方案2】:

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


    我强烈推荐 Scott Meyers 的 this 谈话,其中更详细地说明了你在做什么以及虚假分享与此有何关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多