Ответ 1
Да! Глобальные, захваченные и переданные переменные по-прежнему доступны после вызова detach()
.
Однако, если вы вызываете detach, вполне вероятно, что вы хотите вернуться из функции, создавшей поток, позволяя объекту потока выйти из области видимости. Если это так, вам нужно будет позаботиться о том, чтобы ни один из локалей этой функции не передавался нить ни по ссылке, ни через указатель.
Вы можете придумать detach()
как объявление о том, что нить не нуждается ни в чем локальном для создающего потока.
В следующем примере поток продолжает обращаться к int
в стеке начального потока после того, как он вышел из области видимости. Это поведение undefined!
void start_thread()
{
int someInt = 5;
std::thread t([&]() {
while (true)
{
// Will print someInt (5) repeatedly until we return. Then,
// undefined behavior!
std::cout << someInt << std::endl;
}
});
t.detach();
}
Вот несколько возможных способов, чтобы ковер не был выметен из-под вашего потока:
- Объявить
int
где-нибудь, что не выйдет за пределы области действия в течение жизни любых потоков, которые в ней нуждаются (возможно, глобальных). - Объявить общие данные как
std::shared_ptr
и передать это значение в поток. - Перейдите по значению (выполняя копию) в поток.
- Перейдите по ссылке rvalue (выполняющей движение) в поток.