微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正在创建 unique_ptr 线程安全

如何解决正在创建 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 的默认构造函数是否安全而不知道它的定义。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。