这是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, ®ional);
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(®ional);
MPI_Finalize();
return 0;
}
答案 0 :(得分:1)
这显然是Boost.MPI中的一个错误。
对于序列化类型,例如std::list
,取消会从request::cancel()
转发到request::handle_serialized_irecv
,但未指定ra_cancel
的正确处理。