|
0 / 0 / 0
Регистрация: 17.07.2020
Сообщений: 19
|
||||||||||||||||
Синхронизация потоков через condition_variable17.07.2020, 20:04. Показов 3818. Ответов 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
|
||||||||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 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
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 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++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|