В моей программе я включил несколько коммуникаторов MPI в структуру данных.К сожалению, иногда деструктор объекта этого типа может вызываться до его инициализации.В моем деструкторе я, конечно, называю MPI_Comm_Free
.Но если это вызывается на недействительном коммуникаторе, код вылетает.
Я просматривал стандарт MPI, но не могу найти функцию для проверки работоспособности коммуникатора.Я также предполагаю, что не могу использовать MPI_Comm_set_errhandler
, чтобы попытаться поймать бесплатное исключение, потому что нет действительного коммуникатора для установки обработчикаЯ мог бы сохранить значение флага в своем собственном высказывании, если коммуникатор действителен, но я предпочитаю избегать дублирования такой информации о состоянии.Есть ли какой-нибудь встроенный способ, которым я могу безопасно проверить работоспособность коммуникатора?
Вот базовая программа, демонстрирующая мою проблему:
#include <mpi.h>
typedef struct {
MPI_Comm comm;
} mystruct;
void cleanup(mystruct* a) {
MPI_Comm_free(&(a->comm));
}
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
mystruct a;
/* Some early exit condition triggers cleanup without
initialization */
cleanup(&a);
MPI_Finalize();
return 0;
}