Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810

std::thread - как запустить поток отложенно?

02.05.2023, 11:08. Показов 6490. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В заголовке вопрос в общем-то.

Я вот этот момент в новомодном С++ не могу никак понять: как создать объект потока, но запустить выполнение потока его позже, не в конструкторе?
Почему нет такого варианта в std::thread? или я не вижу?
как так странно всё задизайнено?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2023, 11:08
Ответы с готовыми решениями:

Std::thread как усыпить/ пробудить поток?
Есть ли в std::thread возможность как - то приостановить поток, не разрушая его, а потом, по какому - то сигналу / прерыванию - возобновить...

Как остановить поток std::thread ? Есть ли более подходящие аналоги?
Итак, в моей игре код разделён на два потока, основной - рендеринг и прочее, второй - расчёт физики. void qqq() { while (true) {...

Как удалить зависший std::thread::detach поток без внедрения туда дополнительной контролирующей логики
Здравствуйте, имеет ли кто-то ссылочку на какой-нибудь ресурс где случайно окажется возможным для скачивания файл с книгой "Энтони...

77
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 14:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
Речь об объекте std::thread?
Да
Цитата Сообщение от zayats80888 Посмотреть сообщение
Чем инициализированный по-умолчанию объект std::thread хуже nullptr?
В данном случае я упомянул о семантической стороне вопроса. Один объект - один поток. Это думаю логичнее, чем два объекта - один поток.

Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
И в остатке у нас всё равно один объект.
На самом деле 2 объекта, но поток будет один. Там ведь перемещение, а это как бы уже намекает, что мы из одного объекта перемещаем в другой. Итого 2. Не в сам же объект в себя перемещаем (в этом нет смысла)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 14:59
Цитата Сообщение от Undisputed Посмотреть сообщение
Это думаю логичнее, чем два объекта - один поток.
Но второй объект временный, это prvalue, семантически такой подход не уступает, например, функции-члену create, если б такая была, имхо.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.05.2023, 15:02
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну да, поэтому пусть каждый изобретает свои костыли в меру своего (не)понимания. И очередной повод дописать новый том "склизкие места С++".
Типичный "С++ way". Я ж говорю - специфичный мир красноглазиков в комитетах С++ заседают.
Не понимаю, что здесь склизкого? Класс полностью в концепции RAII. Это основная концепция языка и она всем известна. Тут скорее просто когнитивное искажение из-за сред и языков, которые использовали до C++, где этой концепции нет (вот и NEED-A-JOB вокруг этой мысли прошел:
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
Особенно когда параллельно другие языки изучаешь.
Или, к примеру, тот же Qt из-за своего возраста к RAII пришел очень поздно, но взрастил на себе целую армию программистов, которые мыслят их подход как единственно верный.

Что касается всяких платформо-специфических вещей, то раз их нет в std::, значит либо их туда объективно нельзя добавить, либо в стандарте есть дефект. Во втором случае - в ваших (наших) силах на исправление ситуации повлиять: https://stdcpp.ru/
Но я хочу обратить внимание, что std::thread родился из boost::thread, в котором как раз было очень много платформоспецифичных компонентов, автор которой (Anthony Williams) принимал активное участие в стандартизации. Вот пример своего рода стенографии обсуждения (пусть даже не совсем по данной теме, но близко): https://isocpp.org/files/papers/p0206r0.html. Скажите, положа руку на сердце, - это работа "красноглазиков"? Чего мы добиваемся этим безусловным "хейтом" людей из комитета? Разве это конструктивно? Почему нельзя оценивать работу людей справедливо и учитывать контекст принятых решений?

Продолжаем по теме развития std::thread:
Вот пример, здесь предлагаются к добавлению атрибуты, например для указания размера стека потока (это как раз пример платформо-специфичной возможности): полезная вещь в определенных ситуациях, бесспорно. Здесь развитие этого предложения с анализом возможности добавления на разных платформах. Оцените масштаб проработки, в документе приведены и рассмотрены самые различные платформы, чтобы обоснованно сделать вывод, возможно ли добавить ту или иную возможность в стандартную библиотеку. То же самое вполне возможно сделать и для SUSPENDED режима и для чего-то еще.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 15:09
Цитата Сообщение от zayats80888 Посмотреть сообщение
Но второй объект временный, это prvalue, семантически такой подход не уступает, например, функции-члену create, если б такая была.
Думаю все же уступает, т.к де-факто мы на семантическом уровне имеем дело с двумя объектами. То есть это выглядит примерно так:
C++
1
2
3
std::string s1;
s1 = std::string("hello");
std::cout << s1;
Но зачем, если можно сразу так:
C++
1
2
std::string s1("hello");
std::cout << s1;
При работе с объектами, мы скорее встретим второй вариант, чем первый. Первый вариант, я думаю выглядит заметно ужаснее. Это та логика которую я применяю к потокам в данном случае. При этом хочу еще раз подчеркнуть, что я не вдаюсь в технические подробности в том смысле, что из них будет оптимальнее. Хоть пусть одинаково будет после оптимизаций, речь только о семантике
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 15:15
Цитата Сообщение от Undisputed Посмотреть сообщение
Но зачем, если можно сразу так
Но у вас не так. С указателем вы просто заменили объект std::thread на объект std::thread*. Объектов все равно два, просто тип поменялся.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 15:19
Цитата Сообщение от zayats80888 Посмотреть сообщение
Объектов все равно два, просто тип поменялся.
В упор не вижу второй объект потока (объект с точки зрения ООП).
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.05.2023, 15:22
Цитата Сообщение от Undisputed Посмотреть сообщение
В данном случае я упомянул о семантической стороне вопроса. Один объект - один поток. Это думаю логичнее, чем два объекта - один поток.
У тебя точно так же два объекта: пустой указатель и указатель, созданный new. Семантика ну ни разу не поменялась.

Цитата Сообщение от Undisputed Посмотреть сообщение
Но зачем, если можно сразу так:
Цитата Сообщение от Undisputed Посмотреть сообщение
При работе с объектами, мы скорее встретим второй вариант, чем первый. Первый вариант, я думаю выглядит заметно ужаснее. Это та логика которую я применяю к потокам в данном случае.
Ну так мы определили уже выше, что "сразу так" для потока в рамках этой темы не подходит.
Нам надо именно "НЕ сразу".
И что, вот такой код для std::string прям-таки вот ни разу не встречался?

C++
1
2
3
4
5
6
7
std:;string str;
if(condition) {
    str = "hello";
}
else {
    str = "world";
}
Что в нем ужасного?

Не по теме:

Хотя ладно. Я, наверное, не буду дальше участвовать в теме, помню старые темы с тобой - слишком много ресурсов надо, чтобы с тобой разговаривать :) Как хотите, короче дальше.

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 15:36
Цитата Сообщение от DrOffset Посмотреть сообщение
У тебя точно так же два объекта: пустой указатель и указатель, созданный new.
Объект у меня один, ведь указатель по факту не является объектом в терминах ООП. Может мне следует перефразировать. Под объектом в данном случае я понимаю экземпляр класса, а экземпляр класса в моем случае именно что один, а в случае #3 их два.

Цитата Сообщение от DrOffset Посмотреть сообщение
Ну так мы определили уже выше, что "сразу так" для потока в рамках этой темы не подходит.
Да, определили Но мы так же определили, что можно создать один экземпляр вместо двух, и этого достаточно что бы запустить поток. Может аналогия со строками проблемная, однако у меня не было задачи привести 100% аналог, это скорее была попытка показать ход мыслей

Цитата Сообщение от DrOffset Посмотреть сообщение
Я, наверное, не буду дальше участвовать в теме, помню старые темы с тобой - слишком много ресурсов надо, чтобы с тобой разговаривать
А жаль)) я рад твоим сообщениям, часто можно что-то подчерпнуть

Добавлено через 5 минут
Уточню, когда я говорю об экземплярах класса, то речь идет об экземплярах std::thread (std::unique_ptr не является объектом потока, это просто враппер для него)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.05.2023, 15:41
Цитата Сообщение от Undisputed Посмотреть сообщение
Под объектом в данном случае я понимаю экземпляр класса, а экземпляр класса в моем случае именно что один, а в случае #3 их два.
Там есть unique_ptr, который класс.
Вот твой пример:
C++
1
2
3
std::unique_ptr<std::thread> pthread; // "объект" потока
// ...
pthread.reset(new std::thread(func)); // аналог run
Эквивалентный пример:
C++
1
2
3
std::unique_ptr<std::thread> pthread; // "объект" потока
// ...
pthread = std::make_unique<std::thread>(func); // аналог run
Да объекта. Два состояния. Первый пример просто срезал угол с функцией reset, но семантически ничего не поменялось.
На самом деле я бы вообще с тобой не спорил, если бы ты не стал говорить, что это якобы семантически более правильно. Нет, не более. Это то же самое + доп. слой абстракции в виде (умного) указателя.
0
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
02.05.2023, 15:46
так по теме: удалось запустить отложенно выполнение или на теории c++ остановились? или надо именно как в современном c++ это сделать средствами c++ ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 15:59
Цитата Сообщение от Undisputed Посмотреть сообщение
объектом в терминах ООП
На мой дилетантский взгляд, дискуссия уже переходит в область демагогии.
"Оборачивание объекта" std::thread в умный указатель ничем не оправдано.
Это имеет смысл для объектов, которые не поддерживают copy/move семантику и/или она технически дорагая и/или отсутствует RAII. Ваш "один объект" не сделает из std::thread синглтон, так что семантичски не вижу разницы.

Добавлено через 10 минут
З.Ы. Кстати, std::thread не поддерживает RAII в полной мере, так что, в отсутствии std::jthread, если бы вы сделали делитер, который джойнит поток, то это имело бы обоснование.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.05.2023, 16:00
Цитата Сообщение от Aledveu Посмотреть сообщение
так по теме: удалось запустить отложенно выполнение или на теории c++ остановились? или надо именно как в современном c++ это сделать средствами c++ ?
Если под "отложенным" понимается создали поток в "замороженном" состоянии, а потом в какой-то момент разморозили и он начал выполняться - этой фичи из коробки в std::thread нет, потому что она, надо полагать, непереносима. Так, что если кому-то нужно именно такое, то стоит посмотреть в сторону ручной эмуляции или использования средств платформы напрямую, или использования пула потоков или чего-то еще. Анализ, короче. нужен.

Если под "отложенным" понимается просто создание объекта потока, а затем его "активация", то рецепт показан выше по теме. Да, тут у адептов других языков возникают вопросы, им этот способ кажется плохим, но он концептуально выполнен в С++ стиле для некопируемых объектов и ничего надежнее, чем этот способ, в современном С++ нет. Да и вообще - когда вся ответственность за создание объекта лежит только на конструкторе, а не распределена по всевозможным методам - это очень хорошо для кода.

Добавлено через 36 секунд
Цитата Сообщение от zayats80888 Посмотреть сообщение
З.Ы. Кстати, std::thread не поддерживает RAII в полной мере, так что, в отсутствии std::jthread, если бы вы сделали делитер, который джойнит поток, то это имело бы каке-либо обоснование.
Выше как раз кидал ссылку на обсуждение этого вопроса.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 16:10
Цитата Сообщение от zayats80888 Посмотреть сообщение
"Оборачивание объекта" std::thread в умный указатель ничем не оправдано.
Оправдано, причины были уже "озвучены", но я повторюсь: это делалось для того, что бы получить "переменную потока", с возможностью инициализировать ее в более позднее время, а инициализацию интерпретировать как некий run. Это ровно то, что спрашивал автор. Покажите как это сделать иначе. И что бы не было два экземпляра std::thread и объясните пожалуйста, чем вариант который вы покажете лучше

Цитата Сообщение от zayats80888 Посмотреть сообщение
Ваш "один объект" не сделает из std::thread синглтон
А это и не нужно. Синглтон для объекта потока означал бы, что нельзя создать более одного потока. Не понимаю, почему вы вдруг решили вспомнить про синглтон
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 16:36
Цитата Сообщение от Undisputed Посмотреть сообщение
И что бы не было два экземпляра std::thread
Но это уже ваши домыслы. ТС вообще не говорил про "объект", он скорее имел ввиду "поток, как объект ОС", когда вы сами упомянули про CREATE_SUSPENDED и он подтвердил.

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Не понимаю, почему вы вдруг решили вспомнить про синглтон
Просто как пример семантики "одного объекта", отличной от той, на которую вы делали акцент.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 16:43
Цитата Сообщение от zayats80888 Посмотреть сообщение
Но это уже ваши домыслы
Конечно нет, это не мои домыслы.
Вот код из #3 std::thread - как запустить поток отложенно?
Один экземпляр std::thread создается в main, а другой в функции launch_thread, а затем перемещается в тот объект, который был передан по ссылке в launch_thread из main. Поэтому мне не совсем понятно, почему вы называете это домыслом, тогда как в этом коде явно видно создание двух экземпляров класса std::thread.

Суть вопроса была в том, что бы иметь на руках переменную потока с возможностью запустить поток после создания переменной, а не в момент ее инициализации. Это то, что я понял из вопроса, и ТС это никак не опроверг, иначе я бы не писал все эти сообщения. Причем решение я ему тоже дал и оно отвечает принципу один объект - один поток.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 16:51
Цитата Сообщение от Undisputed Посмотреть сообщение
почему вы называете это домыслом, тогда как в этом коде явно видно создание двух экземпляров класса std::thread.
Домыслом является не код из поста 3, а то, что вы выдвигаете это требование к тому коду. Если уж придираться, то требование ТС было "не в конструкторе", чего и ваш подход не решает (это вообще не решаемо).
Цитата Сообщение от Undisputed Посмотреть сообщение
Суть вопроса была в том, что бы иметь на руках переменную потока с возможностью запустить поток после создания переменной, а не в момент ее инициализации.
Да, ключевое - "переменная потока" и "запустить поток после создания переменной". Код из поста #3 удовлетворяет это требование.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.05.2023, 17:07
Цитата Сообщение от zayats80888 Посмотреть сообщение
Домыслом является не код из поста 3, а то, что вы выдвигаете это требование к тому коду.
Скорее это рекомендация, а не требование. Не знаю, почему вы интерпретируете рекомендацию как домысел.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Код из поста #3 удовлетворяет это требование.
С этим я не спорю. Дело в другом. Вот вам нужен один объект, например вектор. Вы же не будете создавать два вектора, перемещать один в другой, и только потом пользоваться вектором, а сразу будете использовать один экземпляр вектора. То же самое и тут.

Просто в случае с потоками есть техническое ограничение и мне понятны мотивы создания двух std::thread из #3, однако используя unique_ptr, мы можем обойти эти ограничения и использовать только один std::thread.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 17:20
Цитата Сообщение от Undisputed Посмотреть сообщение
Скорее это рекомендация, а не требование. Не знаю, почему вы интерпретируете рекомендацию как домысел.
В посте #33 это было именно требование, и вы просили показать, как это сделать, очевидно, не удовлетворившись кодом из поста #3.

Цитата Сообщение от Undisputed Посмотреть сообщение
Вы же не будете создавать два вектора, перемещать один в другой, и только потом пользоваться вектором
Это от контекста зависит, вектор в этом плане ничем не отличается от std::string в примере DrOffset выше, который вы сочли не совсем подходящим.
И я именно так делаю, когда вместо пары вызовов clear() и shrink_to_fit() просто пишу vec = {};.
А еще я не буду оборачивать один вектор в unique_ptr ни при каких условиях .
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.05.2023, 17:39  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
std::unique_ptr<std::thread> pthread; // "объект" потока
// ...
pthread = std::make_unique<std::thread>(func); // аналог run
А зачем вот это вообще все, когда тоже самое?

C++
1
2
3
std::thread trd;
// ...
trd = std::thread(func);
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
02.05.2023, 17:40
Цитата Сообщение от KSergey9 Посмотреть сообщение
А зачем вот это вообще все, когда тоже самое
Так о том и речь, читайте весь пост:
Цитата Сообщение от DrOffset Посмотреть сообщение
Это то же самое + доп. слой абстракции в виде (умного) указателя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2023, 17:40

Поток std::thread с шаблоном в классе
Доброго времени суток уважаемые! Уперся лбом в следующую проблему. При использовании параллельных потоков в основном потоке проблем...

Как убить std::thread?
К сожалению мне так и не удалось найти информацию о том, как корректно убить std::thread в случае необходимости. Как правило, предлагают...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void test(vector&lt;char&gt; data) { ...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

Boost::thread vs std::thread
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru