С++ 11 std:: thread:: отсоединение и доступ к общим данным

Если у вас есть общие переменные между std::thread и основным потоком (или любым другим потоком, если на то пошло), можете ли вы получить доступ к этим общим переменным, даже если вы выполняете метод thread::detach() сразу после создания потока?

Ответ 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.