const& str);
void create_thread()
{
std::thread thr(f, std::string("..."));
thr.detach();
}
Каков срок жизни этого prvalue(аргумента в конструкторе thr)?
Конец полного выражения
Тогда он разве не должен был стать невалидным в потоке?
Должен
В данном случае - нет
https://en.cppreference.com/w/cpp/thread/thread/thread
Ну и что? Ну по значению передается, а где само значение?
The arguments to the thread function are moved or copied by value
Где копия сохраняется и почему срок его жизни дольше стека в create_thread?
А почему в куче, а не в tls, например?
У тебя в примерах в принципе ничего не стеке не хранится, поэтому странный вопрос
В TLS ещё не созданного потока, да ещё к которому как-то обратились из создающего?
А ты что с ним сделал?) Передал в конструктор стринга. Знаешь, что он делает?
Посмотрел. Копирует Но в целом это одно и то же, я говорил про валидность ссылки на элемент, который создаётся вызывающим потоком
Ну смотри. Создаётся объект std::thread. Он получает аргументы, сохраняет их у себя. Запускает поток, передаёт из копии внутри объекта эти аргументы. Объект потока живёт пока он выполняется. Всё корректно
Это не объясняет почему он не может сохранить аргументы через Type&& MyCachedArg
Не знал, что такой вопрос стоит. И не очень его понимаю
А. Дошло. Не подумал про состояние объекта потока
Я имею ввиду, что template<typename Type> void thread(Args&&... arg){ // Какая-то первичная подготовка к созданию потока create_thread(std::forward<Type&&>(arg)...); }
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Состояния потока никакого нет после detach, поэтому не понимаю где в итоге хранится значение
А оно в новый поток не перемещается?
Так поток один
в некоем decay-copy, который получает universal reference, и хранит копию
А он краткосрочные всегда
Обсуждают сегодня