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

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

02.05.2023, 11:08. Показов 6834. Ответов 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
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
03.05.2023, 13:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
Не нужен поток - просто не создавайте его
Я как то столкнулся с таким, что если так делать, Время начала работы потока получаеться разным (непредсказуемым).
В зависимости от состояния системы.
Если иметь поток в приостановленном состоянии, то запуск происходит мгновенною

Добавлено через 2 минуты
Содание потока занимает, не только много времяни, но оно ещё непредсказуемо.

Добавлено через 2 минуты
Звук писал вторым потоком...
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 14:00
Цитата Сообщение от Наталья8 Посмотреть сообщение
Если иметь поток в приостановленном состоянии, то запуск происходит мгновенною
Строго говоря, тема совсем не о том, что будет быстрее запускаться Да и это вообще про скорость это спорно. Может на ядре сидит поток с IRQL > PASSIVE_LEVEL, то его уже никак не вытеснишь из user-mode, придется ждать.
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
03.05.2023, 14:00
Если запускать поток одновременно с его созданием, то начало записи не совпадает с видео...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 14:01
Наталья8, ну там большая работа проводится, стек потока выделяется, регистрируется объект ядра (std::thread инкапсулирует поток ОС), в общем много чего. Это прямо провал в производительности по сравнению с остальным локальным кодом программы. Вот просто первая попавшаяся ссылка (с первой попавшейся ОС): https://developer.apple.com/li... reads.html
Написано: Creation time - Approximately 90 microseconds. 90 микросекунд! Это просто пропасть по сравнению с остальным кодом.

Поэтому-то и используют пулы потоков, где все потоки уже запущены и просто ждут задач. Случай, когда у нас есть один поток в suspended (каким угодно способом) режиме - это просто вырождений случай пула потоков из одного потока (и без очереди)
3
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.05.2023, 14:02
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно реализовать как угодно, я лично не против любых вариантов (правда с RVO чем тогда будет отличаться от прямого создания объекта в месте запуска?).
Именно в случае срабатывания RVO и будет создан объект в левой части присваивания возвращаемого значения. Об этом я и говорю. Один объект и он же - один поток)
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
03.05.2023, 14:02
Цитата Сообщение от Undisputed Посмотреть сообщение
Может на ядре сидит поток с IRQL > PASSIVE_LEVEL, то его уже никак не вытеснишь из user-mode, придется ждать
Тоже польза...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 14:09
Цитата Сообщение от IGPIGP Посмотреть сообщение
Именно в случае срабатывания RVO и будет создан объект в левой части присваивания возвращаемого значения. Об этом я и говорю. Один объект и он же - один поток)
Я ж не против. Но тут выше как бы отложенный запуск под этим соусом обсуждался, а так он не отложенный будет, а сразу запускаемый выражением инициализации (пусть с RVO).

А вот если ваш пример чуть переделать и засунуть в лямбду само создание потока, а потом эту лямбду где-то сохранить и вызвать в нужный (отложенный) момент, то будет то, что надо
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.05.2023, 14:14
Цитата Сообщение от DrOffset Посмотреть сообщение
правда с RVO чем тогда будет отличаться от прямого создания объекта в месте запуска?
А-а-а, - понял) То есть, речь о том, как создать поток, а потом передать ему задачу? Но ведь в случае который показывал Undisputed, поток и не создавался ведь? Пустой объект и физический поток - не одно и то же. Тогда не понятно о чём спор.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
А вот если ваш пример чуть переделать и засунуть в лямбду само создание потока, а потом эту лямбду где-то сохранить и вызвать в нужный (отложенный) момент, то будет то, что надо
Хм... Интересный вариант! Нужно обмозговать)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 14:16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но ведь в случае который показывал Undisputed, поток и не создавался ведь? Пустой объект и физический поток - не одно и то же. Тогда не понятно о чём спор.
Да спор тут о семантике был
0
03.05.2023, 14:21  [ТС]

Не по теме:

Разжег пожар :D

0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 14:26
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хм...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Thread
{
public:
    template <typename F, typename ...Args>
    Thread(F fn, Args&& ...args)
        : m_run([fn, &args...] { 
             return std::thread(fn, std::forward<Args...>(args...)); 
          })
    {}
 
    std::thread run()
    {
        return m_run();
    }
    
private:
    std::function<std::thread()> m_run;
};
 
void foo(int v) {
    std::cout << "Answer is " << v << std::endl;
}
 
int main()
{
    Thread thr(&foo, 42);
 
    auto running = thr.run();
    running.join();
}
1
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
03.05.2023, 15:01
Цитата Сообщение от DrOffset Посмотреть сообщение
&args...
Кликните здесь для просмотра всего текста
ой-ой-ой
2
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 15:05
zayats80888, да, это залет

Добавлено через 30 секунд
PS. Конечно же там надо по значению их сохранить
1
03.05.2023, 17:39

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Разжег пожар :D
Хлеба и зрелищ !
Вообще молодец.

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 20:49
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому-то и используют пулы потоков, где все потоки уже запущены и просто ждут задач.
Кое-что хочу добавить (нет для спора, а для полноты картины). Может сложиться впечатление, что запуск уже подготовленного потока на 90 микросекунд быстрее чем если создать поток и запустить его т.к не тратится время на подготовку.

Однако что бы поток из пула "проснулся" и выполнил задачу, нужно его уведомить. Такое уведомление/запуск потока на исполнение задачи как правило сопровождается "погружением" в kernel space, а это тоже требует времени, плюс время на организацию начала выполнения задачи (например, может быть захват мьютекса что бы извлечь задачу из списка задач, что так же может приводить к "погружению" в kernel space).

А когда мы создаем поток и сразу его запускаем, то задержек по этим причинам у нас не бывает. Если тредпул и выигрывает у такого
"наивного" подхода, то уж не на 90 заявленных микросекунд
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.05.2023, 21:10
Цитата Сообщение от Undisputed Посмотреть сообщение
Такое уведомление/запуск потока на исполнение задачи как правило сопровождается "погружением" в kernel space, а это тоже требует времени, плюс время на организацию начала выполнения задачи (например, может быть захват мьютекса что бы извлечь задачу из списка задач, что так же может приводить к "погружению" в kernel space).
Захват мьютекса стоит несравнимо меньше. Вот по той же ссылке, для той же ОС, чтобы можно было адекватно сравнивать тайминги: https://developer.apple.com/li... i-CH8-SW10
Mutex acquisition time - Approximately 0.2 microseconds
Цитата Сообщение от Undisputed Посмотреть сообщение
А когда мы создаем поток и сразу его запускаем, то задержек по этим причинам у нас не бывает. Если тредпул и выигрывает у такого
"наивного" подхода, то уж не на 90 заявленных микросекунд
Никто не заявлял никакие микросекунды. Это был пример к комментарию про низкую производительность запуска нового потока. И то, я привел его просто в подкрепление своих слов, а то ведь есть тут спорщики ради спора В общем, пример подтверждает, что она действительно низкая, и если есть возможность ее увеличить, то стоит ей воспользоваться.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.05.2023, 21:56
Цитата Сообщение от DrOffset Посмотреть сообщение
Никто не заявлял никакие микросекунды
Ну так apple же заявляет, как я понял.

Так же уведомление тоже время занимает. Более того, на уведомлении все не заканчивается... условно говоря некий notify_all "разбудит" n потоков, которые вытеснят n задач (возможно даже напрасно, так как задача может быть одна), а затем они благополучно "уснут", ничего не сделав... все это тоже время

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

Добавлено через 19 минут
По посту #62 так же хочу сделать уточнение. Когда я говорил про скорость, то имел ввиду то, что условно говоря "мгновенного" запуска может и не быть. Иногда даже если код написан оптимально, само окружение в котором этот код выполняется, может ставить палки в колеса.

Как частный случай, можно рассмотреть ситуацию когда есть привязка потока к конкретному ядру (cpu affinity), а это ядро может быть слишком занято более приоритетными задачами, когда нам захочется пробудить поток. И в таком случае эта условная "мгновенность" может превратиться в условную "долгую ночь"...
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,370
03.05.2023, 23:11
Цитата Сообщение от DrOffset Посмотреть сообщение
то уж не на 90 заявленных микросекунд
Я с этим долго мучился. ставил разные костыли и задержки.
Могло опоздать на полсекунды. Какие там 90 микросекунд...

(На виндовс... создание уже запущенного потока...)

Добавлено через 4 минуты
0.3 секунды уже заметно отставание...

Добавлено через 7 минут
Здесь такого наворочано. Всё равно ни чё не поймёшь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//----------------------- Поток звука в приостановленном состоянии
hRecv = CreateThread(NULL, 0, RecordAudioStream, (void*)&_param, CREATE_SUSPENDED, NULL);
SetThreadPriority(hRecv, THREAD_PRIORITY_HIGHEST);
//----------------------- ЦИКЛ
SetWindowPos(h_consol, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);// Счётчик по верх всех окон
 
scr_wind.left = 0;
scr_wind.top = 0;// Через хук на клаву, получит поправку для координат рамки  +...- (раньше здесь были координаты измерения)
HINSTANCE hinstExe = GetModuleHandle(NULL);// Установить хук на клавиши
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstExe, 0);
 
// ---------- Здесь был отсчёт к нулю....
 
once = false; Sleep(600);// <---- Последняя задержка
    cvDestroyWindow("Frame");
UnhookWindowsHookEx(hHook); //<<----- Снять захват КЛАВИШЬ
ix += scr_wind.left;
iy += scr_wind.top;
//      SetForegroundWindow(GetConsoleWindow());// Консоль по верх всех окон
    get_screen = sh.get(ix, iy);//------- Screensoot c экрана (Первый кадр)
//--------------------------------
    if (Win_x * Win_y > frame_const)// Магическое число если площадь рамки видео 1280 x 720
        
        //ShowWindow(hWnd_win, SW_HIDE);// <== Убраю рамку == non | WS_VISIBLE ??? (строка 1343)        
    DestroyWindow(hWnd_win);
ResumeThread(hRecv);// Запуск потока звука
 
    t1 = high_resolution_clock::now();// ---------  Засекаем время записи первого кадра (я здесь обнулял fact_fr_ps  и  sec_old )
Мусор...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2023, 23:11

Поток 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 стандарте приняли, с бустом все ясно...


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

Или воспользуйтесь поиском по форуму:
78
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru