Как можно безопасно уничтожить std::latch в C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как можно безопасно уничтожить std::latch в C++?

Сообщение Anonymous »

И clang, и gcc полагают, что следующая программа выдает ошибку use-after-free при компиляции с использованием средства очистки адресов:

Код: Выделить всё

#include 
#include 

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

Подробнее здесь: https://stackoverflow.com/questions/798 ... latch-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»