gpt4 book ai didi

multithreading - OpenMP和shared_ptr

转载 作者:行者123 更新时间:2023-12-03 12:59:02 25 4
gpt4 key购买 nike

以任何方式在OpenMP并行块中使用shared_ptr安全吗? shared_ptr通过使用原子来保持引用计数的原子性,并且一般而言,据我了解,我们不应该将C++ 11多线程机制与OpenMP混合使用。因此,根据定义,在我看来,访问pragma omp块内的任何位置的shared_ptr(甚至对于简单的const读取操作)都可能导致问题。还是不是这样?

最佳答案

您的分析是正确的。首先,看一下有关OpenMP and std::atomic 的问题。注意,std::shared_ptr不一定是使用原子实现的。这也适用于共享控制块,在复制操作期间会对其进行修改。有两种情况:

  • 调用get/operator->/operator*,每个线程指向一个对象指向一个shared_ptr。仅对目标对象执行只读操作。这与C++ 11和OpenMP之间的规范差距一样安全。不执行控制块操作。我认为这与使用原始指针没有什么不同。
  • 从多个线程调用一个共享get上的operator->/operator*/shared_ptr。这仍然同样安全。
  • 复制/删除指向多个线程中不同对象的线程本地shared_ptr。由于没有共享日期,因此它应该仍然尽可能安全。
  • 从多个线程中复制/删除指向同一对象的线程本地shared_ptr。现在我们知道这涉及共享控制日期,但是根据C++标准,它是安全的。 std::atomic/OpenMP的参数适用。它实际上是安全的,但定义不是很好。
  • 跨多个线程修改(reset)线程共享的shared_ptr。这是不安全的。此处可以使用atomic<shared_ptr>,但适用相同的参数。

  • 我还要再作一个区分。如果考虑将 std::atomic与OpenMP一起使用,则可以选择使用OpenMP惯用的 pragma omp atomic-没有与 shared_ptr等效的OpenMP。因此,除了在 shared_ptr之上实现自己的 omp atomic之外,您实际上别无选择。

    关于multithreading - OpenMP和shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53198251/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com