|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||||||
Изменение переменной и отработка её значения в другом потоке, казалось бы элементарная задача23.09.2024, 23:35. Показов 1177. Ответов 10
Метки нет (Все метки)
Всем привет
задача есть переменная которая будет вводится с консоли в основном потомке и есть дочерний поток , который должен отрабатывать введенные значения и что-то делать соразмерно введенным значениям. в данном примере изменяемая переменная doCPU и значит стартуем дочерний поток, переменная истина, цикл выполняется. основной поток ждет некоторое время , и меняет значение переменной и это измененное значение никак не отрабатывается в другом потоке. по факту в одном потоке я только читаю, в другом только изменяют переменную doCPU и эта переменная даже изменяется, но это изменение не попадает в дочерний поток. Вопрос почему?
получилось вот так , что странно
как условие whileобрамить в мутекс? Добавлено через 2 минуты вообще почему здесь нужен мутекс? у нас же нет изменения переменной в обоих потоках более того применение мутекса оно заставляет другой поток ждать. а это противоречит концепции. т.е. получается надо изменять промежуточную переменную в основном теле - принимать на ввод от пользователя, и потом введенное значение присваивать целевой переменной. какая-то муть получилась. а есть способы проще?
0
|
|||||||||||
| 23.09.2024, 23:35 | |
|
Ответы с готовыми решениями:
10
Ожидание потоком определенного значения переменной в другом потоке Как получить значение переменной созданной в потоке, в другом потоке? Управление потоками. Изменение значения label (созданного в потоке 1) в потоке 2 |
|
434 / 156 / 28
Регистрация: 12.12.2020
Сообщений: 1,255
|
|
| 23.09.2024, 23:38 | |
|
Переменную объявите как volatile. Компилятор видит что она в потоке не меняется и оптимизирует код, вообще выкидывая проверку.
2
|
|
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
||||||||
| 23.09.2024, 23:55 [ТС] | ||||||||
|
Добавлено через 1 минуту
работает volatile как -то можно запретить компилятору такие куда его не просят оптимизации?
0
|
||||||||
|
434 / 156 / 28
Регистрация: 12.12.2020
Сообщений: 1,255
|
|
| 24.09.2024, 01:35 | |
|
Мутекс он так же говорит компилятору что эта переменная где то меняется. Но в данном случае помоему более правильно использовать волатиле, так как мутекс отвечает за синхронизацию доступа разных потоков к одному ресурсу. У вас же ничего такого не требуется.
Можно попробовать запускать компилятор без оптимизиции, но незнаю, насколько это поможет. Волатиле - это то что тут надо использовать. И привыкать надо именно к такому, а не отключать у компилятора оптимизацию Это даст однозначное поведение кода при всех "режимах".
1
|
|
|
Вездепух
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
|
|||
| 24.09.2024, 01:56 | |||
Сообщение было отмечено pup_kin как решение
Решениеprintf может заставить ваш код "работать" (хотя printf - не самый лучший пример).Во-вторых, синхронизационные примитивы создают барьеры доступа к памяти. Семантика "сохранности значения" разделяемой между потоками переменной в общем случае не применима через барьер доступа.
1
|
|||
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|||||||
| 24.09.2024, 06:31 | |||||||
|
лечение в данном случае:
1
|
|||||||
|
1476 / 490 / 73
Регистрация: 22.09.2023
Сообщений: 1,507
|
|||
| 24.09.2024, 09:17 | |||
|
1
|
|||
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|||
| 24.09.2024, 09:24 | |||
|
Dushevny, другой процесс эту переменную менять не может, не вижу, чтобы такое было в коде возможно
а вот гонка данных есть чтение в одном потоке
1
|
|||
|
1476 / 490 / 73
Регистрация: 22.09.2023
Сообщений: 1,507
|
|||
| 24.09.2024, 09:42 | |||
doCPU = false; может произойти до или после чтения по внешним причинам и введение синхронизации кроме замедления цикла ничего к поведению программы не добавит. "Я так думаю!"
1
|
|||
|
фрилансер
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
|
|
| 24.09.2024, 09:57 | |
|
1
|
|
|
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
|
|||||||||||
| 24.09.2024, 16:03 [ТС] | |||||||||||
|
добавление cout также заставляло работать. я подумал, что это какие очереди к потокам ввода вывода ![]() Добавлено через 4 минуты что имеется ввиду - неправильные объекты или организация работы с потоками? почему не работоспособна? это не программа это кусок вырванный из контекста, так то конечно в основном потоке идет ожидание ввода пользователя. и кстати очень интересно если например я ввожу переменную которую через мутексы отрабатываю в потоках, то одидание ввода не нужно делать на этой переменной, нужен буфер типа
Добавлено через 3 минуты изначально гонка была потому что один поток - несерьезно. но потом выяснилось что не работает, и был написан один поток. там вообще массив потоков. и наверное одну переменную объявлятть для работы во всех потоках - не есть гуд. наверное надо объявить для каждого потока свою переменную, например маммис потоков и массив переменных для каждого потока, и меняться они будут из основного цикла , копированием например. Но меня интересует почему программа не работоспособна в парадигме с++ очень интересно. Добавлено через 1 минуту в данном случае гонки нет потому что чтения булева типа - можно сказать атомарно.- порчи данных не будет, [даже если в момент начала чтения переменная булева была 00000001, и в процессе изменилась на 00000000 - то она также консистентна, тут же один конденсатор] если будет другой тип - то наверное будет гонка это надо проверить. Добавлено через 1 час 39 минут p.s. как выяснилось с++ очень современный язык, поддерживающий все модные лексеммы имеющиеся в других языках. Добавлено через 50 минут
0
|
|||||||||||
| 24.09.2024, 16:03 | |
|
Помогаю со студенческими работами здесь
11
Dispatcher.Invoke, присвоение переменной созданной в другом потоке свойству UI элемента
Изменение Javascript переменной в другом фрейме! Помогите плз!
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|