Если у вас есть общие переменные между std::thread
и основным потоком (или любым другим потоком, если на то пошло), можете ли вы получить доступ к этим общим переменным, даже если вы выполняете метод thread::detach()
сразу после создания потока?
С++ 11 std:: thread:: отсоединение и доступ к общим данным
Ответ 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 (выполняющей движение) в поток.
Ответ 2
Да. Отсоединение потока означает, что оно очищается после себя, когда оно закончено, и вам больше не нужно, и вам не разрешено, join
it.