Подтвердить что ты не робот

В С++ 11, какова точка потока, который "не представляет поток выполнения"?

Оглядываясь на новую информацию о потоках в С++ 11, чтобы увидеть, как легко она сопоставляется с pthreads, я замечаю любопытный раздел в области конструктора thread:

нить();
Эффекты: Создает объект потока, который не представляет собой поток выполнения.
Постусловие: get_id() == id()
Броски: ничего.

Другими словами, конструктор по умолчанию для потока фактически не создает поток. Очевидно, он создает объект потока, но насколько это полезно, если для него нет кода поддержки? Есть ли другой способ, по которому может быть присоединен "поток выполнения" к этому объекту, например thrd.start() или что-то подобное?

4b9b3361

Ответ 1

Есть ли другой способ, которым может быть присоединен "поток выполнения" к этому объекту, например thrd.start() или что-то подобное?

// deferred start
std::thread thread;

// ...

// let start now
thread = std::thread(functor, arg0, arg1);

std::thread - тип MoveConstructible и MoveAssignable. Таким образом, это означает, что в коде, таком как std::thread zombie(some_functor); std::thread steal(std::move(zombie)); zombie, будет оставлено специальное, но действительное состояние, связанное с потоком выполнения. Конструктор по умолчанию становится свободным в некотором смысле, поскольку все, что ему нужно сделать, - это поместить объект в это точное состояние. Он также позволяет массивы std::thread и операции типа std::vector<std::thread>::resize.

Ответ 2

Это означает то же самое, что и:

 std::vector<int> emptyList;

emptyList пусто. Так же, как построенный по умолчанию std::thread. Так же, как построенный по умолчанию std::ofstream не открывает файл. Есть вполне разумные причины, чтобы классы, которые по умолчанию строили себя в пустое состояние.


Если у вас пустой поток:

std::thread myThread;

Фактически вы можете начать поток, выполнив следующие действия:

myThread = std::thread(f, ...);

Где f - некоторая вызываемая вещь (указатель функции, функтор, std::function и т.д.), а ... - аргументы, которые нужно перенаправить в поток.

Ответ 3

Не просто догадки:

"объект потока" относится к std::thread.

"поток выполнения" относится к коллекции ОС аппаратных регистров, которые представляют поток.

С++ 11 ничего не делает, кроме того, что касается использования API OS для доступа к потокам ОС, чтобы сделать перенос потоков С++ переносимым для всех ОС.

нить();
Эффекты: Создает объект потока, который не представляет собой поток выполнения.
Постусловие: get_id() == id()
Броски: ничего.

Это означает, что построенный по умолчанию std::thread не относится к потоку выполнения, созданного ОС.

A std::thread может быть присвоено новое значение и, таким образом, начнет ссылаться на поток выполнения ОС с помощью оператора присваивания перемещения:

std::thread t;  // Does not refer to an OS thread
//...
t = std::thread(my_func);  // t refers to the OS thread executing my_func

Ответ 4

Просто гадать, но это просто означает, что поток не запущен. Другими словами, это всего лишь объект, как любой другой - не обязательно фактический поток ОС за ним. Другими словами, если потоки были реализованы поверх pthreads, создание потока потока С++ 11 необязательно вызывает pthread_create() - это необходимо только при запуске потока.