|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
std::thread - как запустить поток отложенно?02.05.2023, 11:08. Показов 6837. Ответов 77
Метки нет (Все метки)
В заголовке вопрос в общем-то.
Я вот этот момент в новомодном С++ не могу никак понять: как создать объект потока, но запустить выполнение потока его позже, не в конструкторе? Почему нет такого варианта в std::thread? или я не вижу? как так странно всё задизайнено?
0
|
|
| 02.05.2023, 11:08 | |
|
Ответы с готовыми решениями:
77
Как удалить зависший std::thread::detach поток без внедрения туда дополнительной контролирующей логики |
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 02.05.2023, 17:55 [ТС] | ||
|
Так я почитал и недоумеваю. По-моему, вариант с std::unique_ptr<std::thread> тогда, когда еще не было (ну в рамках этой ветки) понятно про то, что оператор = для потока не выполняет создание нового объекта и "копирование", а просто "забирает вновь созданный поток себе". Ну я так это увидел. Но т.к. про = обсудили - то уже не понятно зачем за std::unique_ptr теперь держаться.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 02.05.2023, 17:58 | ||
![]() Все это выглядит как попытка продать что-то вместе с чем-то. Скорее всего многие с этим сталкивались, когда хочешь купить что-то одно, но тебе говорят, что ты не можешь это купить, не купив еще кое-что другое. Это то, чего я не понимаю (мне нужен один поток, я могу это сделать создав один объект потока, ну вот одного объекта и должно быть достаточно). имхо, думаю нет особого смысла продолжать, позиции всех сторон ясны, у каждого может быть свое видение ситуации, и это нормально
0
|
||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
|
| 02.05.2023, 18:03 | |
|
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 02.05.2023, 18:28 | ||
|
Вызовов для "замораживания" или "прекращения" потока у std::thread всё равно нет. Управлять выполнением потока надо мьютексами и атомарными переменными.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 02.05.2023, 20:20 | ||||
|
Я всю дорогу говорю о том, что вариант с динамическим std::thread внутри std::unique_ptr ничем не лучше, чем обычное использование std::thread. А вы сейчас о чем? Добавлено через 11 минут Итого 1) Семантика перемещения - есть в обоих случаях 2) Семантика владения - есть в обоих случаях ЧТД.
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||
| 03.05.2023, 06:23 | ||||||||||||||||||
|
нормальные люди вот так и делают:
что лучше, так:
всегда нужно по возможности отдавать предпочтение первому варианту. если есть техническая возможность, то вариант с RAII предпочтительнее. почему так? во втором варианте необходимо учесть, что, теоретически, метод set может быть вызван из разных потоков. и поэтому, для обеспечения инварианта класса (для безопасной работы) необходимо предусмотреть многопоточную синхронизацию (мутекс, например). и вот здесь начинается неиллюзорное усложение кода, и просадка производительности. и метод set, и метод run нужно будет защищать тормозным мутексом. а наличие мутекста в свою очередь потребует реализовывать конструкторы копии, и пошло-поехало. всего этого геммороя можно было бы избежать, если есть возможность передать стартовую настройку через конструктор, и не добавлять классу никаких сеттеров. тогда и мутексы не потребуются. зато будет простой и надежный код. запомни раз и навсегда: 1. сеттеры - зло (хотя порой - необходимое) 2. конструкторы в целом, и RAII в частности - твои лучшие друзья в многопоточном мире.
1
|
||||||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 03.05.2023, 10:54 [ТС] | ||
|
Хотелось бы уточнить:
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||||||
| 03.05.2023, 11:21 | |||||||||||
|
DrOffset,
Думаю мы говорим о разных вещах. Все что ты написал, это рассуждения на уровне деталей реализации, на уровне того, что происходит под капотом. Но я изначально ставил акцент на ![]() То есть, твое утверждение выглядит примерно так:
Но я думаю, что это некорректное суждение. С точки зрения реализации эти две вещи могут напоминать чем-то друг друга или даже быть эквивалентными, но в предметной области это две разные вещи.
0
|
|||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 03.05.2023, 11:39 | ||||
|
Реализация тут вообще не при чем. Я же с первого сообщения сказал, что ты пытаешься наделить семантикой перемещения объект, который и так ей обладает. То, что thread обладает этой семантикой, заявлено в его интерфейсе. Аналогично для unique_ptr. Нет нужды смотреть в реализацию. Хэндл я упомянул лишь затем, чтобы был какой-то предмет обсуждения (что именно перемещаем), но на самом деле для сути разговора не играет роли что именно там перемещается, главное, что это декларируется контрактом класса. Еще раз: ты заявил, что семантика якобы различна. А она не различна, добавлен только еще один слой абстракции, который не меняет семантику. Выше я это доказал. Добавлено через 12 минут Даже если мы сравниваем реализацию, допустим, но мы сравниваем ее семантику, а не сами сущности на эквивалентность. Кто сказал про семантику? Ты. Вот и весь диалог идет про семантику. Никто не пытается сказать, что std::thread и std::unique_ptr - это одно и то же. Не подменяй тезис и не пытайся выставить оппонента дурачком - некрасиво. Но то, что и классы в твоем примере point и clock - обладают одинаковой семантикой - семантикой копирования, и то, что std::thread и указатель\unique_ptr наделены семантикой перемещения и семантикой владения - факт.
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 03.05.2023, 11:47 | |||
Потому что это не имеет смысла. Основная цель наличия указателя заключается в том, что бы обеспечить ленивую загрузку, но никак не наделить семантикой перемещения объект, который и так ей обладает.Как я понял, для тебя: ленивая загрузка == семантика перемещения. Однако в случае с ленивой загрузкой у нас один экземпляр std::thread, а в случае с семантикой перемещения у нас 2 экземпляра std::thread, и это, прошу заметить, ни разу не было опровергнуто Это именно то, о чем я говорю. Не более, не менее
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 03.05.2023, 11:56 | ||||
|
Кажется, что это то же самое, что ты предположил, но нет. Ты же выше просто сказал: "два объекта std::thread - или один - это семантическая сторона вопроса":
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 03.05.2023, 12:08 | ||
|
Добавлено через 1 минуту Важно: я спрашиваю про перемещение самого экземпляра std::thread
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 03.05.2023, 12:29 | |||
|
Undisputed,
До меня вдруг дошло, что ты просто не знаешь что такое семантика... Может быть в этом и проблема. Семантика - это математический закон, который описывает некое поведение. В общем прямо на школьном примере объясню. Допустим у нас есть уравнение, описывающее семантику. Пусть это будет простое квадратное уравнение. Мы его можем решить (реализовать семантику) несколькими разными способами. Ты сейчас как будто утверждаешь, что семантика изменится, если способы решения этого уравнения будут различны, но это противоречит определению. Всякие подсчеты объектов и т.п. появляются именно тогда, когда мы реализуем (решаем уравнение) семантику. На саму семантику это решение не влияет. Т.е. при правильном решении - результат одинаковый. Добавлено через 6 минут ![]() Семантика перемещения у тебя используется, чтобы передать владение динамическим объектом std::thread посредством указателя на него, вместе с этим указателем перемещается и владение самим потоком. Добавлено через 9 минут
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 03.05.2023, 13:00 | ||
|
Если поставить игру слов в сторону, то мне так никто и не объяснил, почему то, что можно решить одним целевым экземпляром, лучше решать двумя экземплярами, добавив еще один вспомогательный.
0
|
||
|
Комп_Оратор)
|
||||||
| 03.05.2023, 13:10 | ||||||
|
DrOffset, в посте:
std::thread - как запустить поток отложенно? NEED-A-JOB, показал вариант win32 реализации структуры потока, которая содержит аж два поля - указатель и ид.. То есть сам по себе поток не атомарен. Я понимаю, что идея передавать потоки в другие потоки не самая плодотворная, но в принципе упорство Undisputed, можно оправдать. Оговорюсь, - я согласен именно с вами поскольку в основном, да, поток будет как Дункан М'Клауд. Один, то есть. А вот если воспользоваться RVO? Я понимаю, что это зависит от реализации, но как пожелание? Может же быть так, что вот тут будет один объект - один поток:
0
|
||||||
| 03.05.2023, 13:29 | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 03.05.2023, 13:35 | |||
![]() Оценочные "лучше", "хуже", "правильнее", "более" и т.п. по отношению к обсуждаемому вопросу тут применяешь только ты. Речь не об этом шла.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 03.05.2023, 13:48 | |||
|
Благодарю каждого, кто уделил время этой теме
0
|
|||
| 03.05.2023, 13:48 | |
|
Как убить std::thread? Использование std::function в std::thread Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list" Boost::thread vs std::thread Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|