在监听列表时,Boost MPI不会释放资源吗?

时间:2017-05-22 13:50:00

标签: c++ boost mpi

这是How do I free a boost::mpi::request?的后续问题。我在听清单而不是单个项目时注意到奇怪的行为。这是我的错误还是提升中的错误?我正在使用MSVC和MSMPI,Boost 1.62。我很确定在等待取消工作时表现不正常。

如果您尝试使用mpiexec -n 2的版本B,那么您将获得一个干净的退出 - 如果您尝试使用版本A,它将无限期挂起。你们都看到了吗?这是一个错误吗?

#include "boost/mpi.hpp"
#include "mpi.h"
#include <list>
#include "boost/serialization/list.hpp"

int main()
{
    MPI_Init(NULL, NULL);
    MPI_Comm regional;
    MPI_Comm_dup(MPI_COMM_WORLD, &regional);
    boost::mpi::communicator comm = boost::mpi::communicator(regional, boost::mpi::comm_attach);
    if (comm.rank() == 1)
    {


        //VERSION A:
        std::list<int> q;
        boost::mpi::request z = comm.irecv<std::list<int>>(1, 0, q);
        z.cancel();
        z.wait();


        //VERSION B:
//      int q;
//      boost::mpi::request z = comm.irecv<int>(1, 0, q);
//      z.cancel();
//      z.wait();

    }
    MPI_Comm_disconnect(&regional);
    MPI_Finalize();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这显然是Boost.MPI中的一个错误。

对于序列化类型,例如std::list,取消会从request::cancel()转发到request::handle_serialized_irecv,但未指定ra_cancel的正确处理。