потокобезопасность отправки MPI с использованием потоков, созданных с помощью std :: async
В соответствии сэтот сайт, использованиеMPI::COMM_WORLD.Send(...)
Поток безопасен. Однако в моем приложении я часто (не всегда) сталкиваюсь с тупиками или получаю ошибки сегментации. Включая каждый вызовMPI::COMM_WORLD
методы сmutex.lock()
а такжеmutex.unlock()
последовательно удаляет взаимоблокировки, а также ошибки по умолчанию.
Вот как я создаю темы:
const auto communicator = std::make_shared();
std::vector 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
это класс, который имеетstd::mutex
член и исключительно вызывает методы, такие какMPI::COMM_WORLD.Send()
а такжеMPI::COMM_WORLD.Recv()
, Я не использую другие методы отправки / получения с MPI.foo
занимаетconst std::shared_ptr &
в качестве аргумента.
Мой вопрос: является ли безопасность потоков, обещанная MPI, несовместимой с потоками, созданными?std::async