безопасно отсоединить поток, а затем выпустить его из области видимости (и он все еще работает)? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующий код, который, я думаю, работает нормально (простите за глупый / надуманный пример).

void run_thread()
{
    std::thread t([]{
        while(true)
        {
            // keep getting chars... to stop peoples eye's hurting : )
            char c = getchar();
        }
    });

    t.detach(); // Detach thread

    // thread goes out of scope here - but is it ok because its detached??
}

int main()
{
     run_thread();    

    // Wait here forever
    while (true) {;}
}

Но после перечитывания я сомневаюсь в этом.Нить т выходит из области видимости.Сейчас я не могу вспомнить, безопасно ли это делать после того, как вы вызвали detach () ... Я думаю, что это так, но, как я уже сказал, у меня есть ноющее сомнение.Кто-нибудь может подтвердить, является ли это хорошей / плохой практикой?

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

detach в основном освобождает экземпляр объекта std::thread, который является «дескриптором» C ++, для реального потока ОС, что делает невозможным join поток позже.

В большинстве случаев лучшесохранить экземпляр thread в какой-то глобальной области видимости, чтобы вы могли join его позже, например, перед выходом из main.Таким образом, вы можете убедиться, что все потоки заканчиваются до основного потока.

Например:

std::thread t; // can be "empty"

void run_thread()
{
    t = std::thread([]{
        while(true)
        {
            // keep getting chars...
            char c = getchar();
        }
    });

}

int main()
{
     run_thread();    

    // Wait here
    std::this_thread::sleep_for(30s);

    // Before exiting wait for the thread to finish
    if (t.joinable())
        t.join();
}
0 голосов
/ 24 мая 2018

Да, это нормально и безопасно в вашем коде.Но это не имеет никакого смысла.main функция будет использовать процессор, а функция потока будет меньше процессорного времени.Вы можете присоединиться к вечному потоку и достичь аналогичного поведения: run_thread никогда не завершится, поэтому main никогда не завершится.

void run_thread()
{
    std::thread t([]{
        while(true){/* also run forever */;}
    });

    // Wait here forever
    t.attach();
}

int main()
{
     run_thread();    
}
0 голосов
/ 24 мая 2018

Тема t выходит из области видимости.Сейчас я не могу вспомнить, безопасно ли это делать после того, как вы вызвали detach ()

You detach(), потому что вы хотите отключить фактический работающий поток с объектом потока.Таким образом, после того, как } t выйдет из области видимости, но фактический поток продолжит работу, пока не завершится его инструкция.

Если бы не detach() std::terminate, поток был бы уничтожен в }

0 голосов
/ 24 мая 2018

Такое использование - точка отсоединения.

...