segurança thread de MPI enviar usando segmentos criados com std :: async

De acordo comesse site, o uso deMPI::COMM_WORLD.Send(...) é thread-safe. No entanto, na minha aplicação, frequentemente (nem sempre) me deparo com deadlocks ou obtenho falhas de segmentação. Anexando cada chamada deMPI::COMM_WORLD métodos com ummutex.lock() emutex.unlock() remove consistentemente deadlocks, bem como segfaults.

É assim que eu crio tópicos:

const auto communicator = std::make_shared<Communicator>();
std::vector<std::future<size_t>> handles;
for ( size_t i = 0; i < n; ++i )
{
   handles.push_back(std::async(std::launch::async, foo, communicator));
}
for ( size_t i = 0; i < n; ++i )
{
   handles[i].get();
}

Communicator é uma classe que tem umstd::mutex membro e chama exclusivamente métodos comoMPI::COMM_WORLD.Send() eMPI::COMM_WORLD.Recv(). Eu não uso nenhum outro método de envio / recebimento com MPI.foo Leva umconst std::shared_ptr<Commmunicator> & como argumento.

Minha pergunta: A segurança de thread prometida pela MPI não é compatível com os threads criados porstd::async?

questionAnswers(2)

yourAnswerToTheQuestion