|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||||||||||||||
Синхронизация потоков через condition_variable17.07.2020, 20:04. Показов 3958. Ответов 17
Метки std::thread (Все метки)
Всем доброго времени суток!
Прошу знатоков C++ помочь в решении следующего вопроса: Имеется некий циклически выполняемый поток, в котором я, используя condition_variable, жду истечения таймаута или завершаю его работу. Для предотвращения ложных срабатываний - использую глобальную переменную _bStar, которая выставляется в false, когда начинается остановка всей программы:
:
Почему так происходит и как добиться завершения потока только после вызова _cvThread.notify_one()? Подскажите пожалуйста, знатоки C++!
0
|
||||||||||||||||
| 17.07.2020, 20:04 | |
|
Ответы с готовыми решениями:
17
Синхронизация потоков с++
Синхронизация потоков через InterlockedCompareExchange |
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 17.07.2020, 20:13 | |
|
Иван_79, флаг выставлять нужно под темже mutex'ом, что и проверяешь его в потоке
0
|
|
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||||||||||||||
| 17.07.2020, 20:28 [ТС] | ||||||||||||||||
|
Тоесть: если я выставлю _bStart = false под мьютексом, который использую при вызове:
0
|
||||||||||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 17.07.2020, 20:59 | |
|
Завершится, почему нет? Без мьютекса просто в коде UB.
0
|
|
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|
| 17.07.2020, 22:09 [ТС] | |
|
Зачем тогда нужен вызов condition_variable::notify_one(), если для контроля _cvThread.wait_for() достаточно предиаката?
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 17.07.2020, 23:11 | |||
|
Зачем отсоединять поток, который использует общие ресурсы, что бы потом пытаться вручную его прерывать и ждать завершения? Чем не устроил joinable поток? Зачем вообще вот это
1
|
|||
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||
| 18.07.2020, 11:21 [ТС] | ||||
|
Прошу прощения за косноязычие.
0
|
||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||||||
| 18.07.2020, 16:40 | ||||||||
Сообщение было отмечено Иван_79 как решение
РешениеВообще для возможности прерывания потока во время ожидания в произвольном примитиве синхронизации придётся написать не очень простую структуру, но в вашем случае 200 мс - это ниочём, можно просто уснуть на этот интервал, проснутся, проверить атомарный флаг. Добавлено через 19 минут например что-то в таком роде Кликните здесь для просмотра всего текста
1
|
||||||||
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||||||||||||||||
| 19.07.2020, 11:38 [ТС] | ||||||||||||||||||
ЗЫ: за пример большое спасибо!
0
|
||||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 19.07.2020, 13:47 | ||
|
Либо ожидание снимается по таймауту в 200 миллисекунд. Поэтому вам и ответили, что предикат все равно можно будет проверить, т.к. есть таймаут.
1
|
||
|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
|
| 19.07.2020, 14:58 [ТС] | |
|
DrOffset
Значит предикат в условной переменной проверяется или по истечению таймаута или при вызове notify_one()/notify_all() и никогда более?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|
| 19.07.2020, 15:02 | |
|
Иван_79, он проверяется, когда условная переменная выходит из ожидания (сна). А из ожидания она может выйти либо по таймауту (если он был задан), либо по явному запросу на пробуждение через notify_one()/notify_all().
0
|
|
| 20.07.2020, 08:41 | |
|
0
|
|
| 20.07.2020, 09:17 | |
|
0
|
|
| 20.07.2020, 09:39 | ||||
|
Не по теме:
поэтому я полез в книгу "С++. Практика многопоточного программирования" авторства Энтони Уильямса. и там прочёл вот такое:
если ты под "выходом из ожидания" имел ввиду, что вообще контроль отдаёт вызывающей функции(а я имел ввиду именно пробуждения и проверку предиката), то я неправ. кстати, там же обнаружил интересное поведение, о котором раньше не думал: Кликните здесь для просмотра всего текста
0
|
||||
| 20.07.2020, 09:50 | |
|
Не по теме: GbaLog-, собственно вопрос не в том, что ложных пробуждений не бывает, а в том из-за чего они происходят.
0
|
|
| 20.07.2020, 10:13 | |||||
|
Не по теме:
я, вроде, вижу вот это:
notify_one() может вызвать гонку? то есть spurious wakeup может возникать, когда был вызван notify_one(). notify_all() должен пробуждать все потоки, так что это уже не spurious, как я понимаю?так же в конце статьи написано:
ещё я залез в ещё одну книжку "The Art of multiprocessor programming".
0
|
|||||
| 20.07.2020, 11:05 | |||
|
Не по теме: GbaLog-, в общем случае наличие ложных пробуждений зависит от реализации, отсюда все эти, казалось бы, противоречия. "Без причины", это условность, которая обозначает зависимость от реализации. Причина всегда есть.
0
|
|||
| 20.07.2020, 11:05 | |
|
Помогаю со студенческими работами здесь
18
Синхронизация потоков через мьютексы Синхронизация потоков через Event-ы (задача producer/consumer) Синхронизация потоков Синхронизация потоков Синхронизация потоков в c++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 01.04.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|