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