C ++ Объявить одну и ту же переменную потока несколько раз (в al oop) - PullRequest
0 голосов
/ 08 мая 2020

Мне было интересно, что произойдет, если я сделаю что-то вроде этого:

void afunction(/*parameters*/) { /*do something*/ }

// And then in main... 

while(1) {
    thread aThread(afunction, /*parameters*/);
    athread.detatch();
    sleep(1);
}

Создает ли это бесконечное количество потоков (до тех пор, пока система не выйдет из строя)? Или он перезаписывает старый поток через 1 секунду (например, убивает поток и создает новый)? Есть ли проблемы, о которых я должен беспокоиться?

1 Ответ

2 голосов
/ 08 мая 2020

Первое.

В частности, когда элемент управления входит в область действия while-l oop -body, создается thread объект aThread, и его конструктор порождает новый поток ОС. (обратите внимание, я предполагаю, что вы используете std::thread, а не какой-либо другой класс потока).

Затем вы вызываете detach() на объекте потока, поэтому поток ОС больше не связан с объектом aThread, но он все еще выполняется.

Затем после задержки в одну секунду достигается конец области видимости, поэтому объект aThread уничтожается, но, поскольку поток ОС был отсоединен от объекта aThread, поток ОС остается продолжать работать самостоятельно.

Затем область видимости вводится снова для следующей итерации while-l oop, и весь процесс повторяется бесконечно.

В общем , лучше вызывать join() в ваших потоках, а не detach(), поскольку это позволит вашей программе выполнить упорядоченное завершение работы. Без join() трудно или невозможно безопасно разорвать ресурсы всего процесса, так как вы не можете гарантировать, что все еще работающие потоки могут не использовать эти ресурсы во время разрыва. Следовательно, большинство хорошо написанных многопоточных программ будут вызывать join() во всех текущих потоках, непосредственно перед концом main(), если не раньше.

...