Seguridad de subprocesos del envío MPI utilizando subprocesos creados con std :: async

De acuerdo aeste sitio web, el uso deMPI::COMM_WORLD.Send(...) es hilo seguro. Sin embargo, en mi aplicación a menudo (no siempre) me encuentro en puntos muertos u obtengo fallas de segmentación. Adjuntando cada llamada deMPI::COMM_WORLD métodos con unmutex.lock() ymutex.unlock() Elimina sistemáticamente los puntos muertos y los segregantes.

Así es como creo hilos:

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 es una clase que tiene unastd::mutex Miembro y llama exclusivamente a métodos comoMPI::COMM_WORLD.Send() yMPI::COMM_WORLD.Recv(). No utilizo ningún otro método de envío / recepción con MPI.foo toma unaconst std::shared_ptr<Commmunicator> & como argumento

Mi pregunta: ¿la seguridad del hilo prometida por MPI no es compatible con los hilos creados porstd::async?

Respuestas a la pregunta(2)

Su respuesta a la pregunta