Код: Выделить всё
#include
#include
int
main()
{
auto *l = new std::latch{2};
std::jthread t{[l] { l->arrive_and_wait(); }};
l->arrive_and_wait();
delete l;
}
Итак, правильно ли я понимаю, а также gcc и clang? Что вы не можете уничтожить защелку после прибытия всех потоков.
Как удалить std::latch? Это объект одноразового использования, поэтому я подумал, что очевидным решением было бы объявить его в теле цикла и использовать его для синхронизации множества параллельных задач перед следующей итерацией. Но, видимо, это неопределенное поведение, верно? В отличие от этого игрушечного примера, в реальной жизни я хочу сохранить потоки, поэтому не хочу объединять их на каждой итерации цикла.
Есть ли какая-нибудь распространенная идиома, например, соединение защелки с семафором, которую вы используете, чтобы решить, что все действительно закончили с защелкой? На этом этапе кажется, что проще использовать необработанный std::atomic_int со встроенными вызовами фьютекса wait и notify_all.
Подробнее здесь: https://stackoverflow.com/questions/798 ... latch-in-c
Мобильная версия