【问题标题】:Can a unique_ptr be destroyed after a non-blocking(such as MPI_Isend) invoke?可以在非阻塞(例如 MPI_Isend)调用后销毁 unique_ptr 吗?
【发布时间】:2021-07-18 05:25:49
【问题描述】:

请看下面的代码:

#include <memory>
void foo() {
  std::unique_ptr<int> sp(new int);
  MPI_Isend(sp, 1, MPI_INT,...);
}

我的问题是:sp 可以在函数foo 的末尾删除吗?

如果是,如果我不知道删除它的确切时间,我该如何管理堆内存?

这能行吗,a.size() 绑定a的内存吗?

#include <memory>
void foo(const vector<int> & a) {
  MPI_Isend((int)a.size(), 1, MPI_INT,...);
}

【问题讨论】:

    标签: c++ memory mpi heap-memory nonblocking


    【解决方案1】:

    来自documentation:“在调用非阻塞发送操作后,发送方不应访问发送缓冲区的任何部分,直到发送完成。”这将包括处理它。

    顺便说一句,文档将其描述为“非阻塞”是完全不正确的。这里发生的事情的正确术语是“异步”。如果它只是非阻塞的,那么缓冲区超出范围就没有问题,因为 MPI_Isend() 方法一旦返回就完全完成了它。

    【讨论】:

      【解决方案2】:

      唯一指针 sp 将一直保留到 foo() 方法结束。

      但是由于 MPI_Isend(...) 是非阻塞函数,因此唯一指针 sp 在用于 MPI_Isend(...) 方法时可能已经被破坏,因为您不等待它完成。它总是建议将复制数据传递给 MPI_ISend(...) 非阻塞方法而不是智能指针。

      【讨论】:

        猜你喜欢
        • 2018-06-11
        • 2015-11-27
        • 2012-01-20
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-01
        • 2012-04-30
        相关资源
        最近更新 更多