Начинается ли поток сразу - PullRequest
0 голосов
/ 29 апреля 2018

Я только начал читать C ++ Concurrency In Action 2012. В Главе 2 показано, что поток вызывается и присоединяется. Поскольку соединение не является атомарной операцией с созданием потока. Под этим я подразумеваю, что поток запускается с std:thread t(...), а в следующей строке выполняется join. Я предполагаю, что когда поток создается, он может начать выполняться в любое время, в том числе сразу. И если он начинает выполняться сразу и завершается до того, как начинает выполняться программа-создатель, то join завершается ошибкой.

Та же проблема возникает, если используется t.joinable().

Если мои предположения верны, то нет никакой гарантии, что join когда-либо будет успешным, а предикат joinable() не поможет. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

A thread объект может представлять поток выполнения, но это не означает, что фактический поток выполнения запущен (даже если это было в какой-то момент времени).

Другими словами, когда вы создаете объект thread (который представляет фактический поток выполнения, т. Е. Вы используете конструктор не по умолчанию), и связанный с ним поток выполнения заканчивается, это событие не изменить состояние объекта thread. Это все равно будет joinable().

Точнее, согласно [thread.thread.class] , пост-условие конструктора, отличного от заданного по умолчанию, равно get_id() != id() (т.е. объект представляет фактический поток выполнения). Единственный способ изменить это условие - это join() или detach() (или его перемещение) - тот факт, что поток выполнения завершен или нет, не меняет возвращаемое значение get_id(). В этом примечании к стандарту разъясняются только те события, которые могут изменить условие:

[Примечание: объект потока не представляет поток выполнения после построения по умолчанию, после перемещения или после успешного вызова отсоединения или соединения. - конец примечания]

0 голосов
/ 29 апреля 2018

Метод соединения по существу говорит: «Выполнение блока до тех пор, пока поток не завершится, и в это время возврат из моего вызова присоединиться».

Если поток уже запущен и завершился к тому времени, когда вы вызываете join, он просто сразу же вернется. Если поток все еще работает, то ваш вызов присоединения будет заблокирован до тех пор, пока поток не завершится, и в этот момент он вернется. Ни в одной из этих ситуаций не будет сбоя.

Ниже приведен точный текст документации для функции соединения:

Функция возвращается после завершения выполнения потока.

Это синхронизирует момент, когда эта функция возвращается с завершением всех операций в потоке: блокирует выполнение поток, который вызывает эту функцию, пока функция не Возврат конструкции (если еще нет).

http://www.cplusplus.com/reference/thread/thread/join/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...