|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||||||||||
Уперся в тупик с потоками. Прошу подсказки30.09.2023, 14:04. Показов 2408. Ответов 50
Метки нет (Все метки)
Здравствуйте!
Есть у меня небольшая самописная демка, писанная когда-то на Delphi. Решил ее переписать на C++ в рамках самообразования. Демка простая - одни объекты гоняются за другими, я на ней тренировался выполнять параллельные расчеты. На Delphi все работало "на ура", а вот с C++ возникли проблемы. Архитектура примерно такая: 1. Есть Контроллер, который отвечает за перемещение и взаимодействие объектов. Он крутится в отдельном потоке. Вернее, не он целиком, а только один из его методов. Возможно, в этом и проблема. Метод запускается через std::thread(&CController::Execute,m_pCon troller).detach(). detach() потому то при join() все зависало. 2. Есть "Визуализатор", который отвечает за отображение объектов. Его процедуры, отвечающие за отрисовку, вызываются из Контроллера. "Визуализатор" является членом класса Контроллера по специальному интерфейсу. 3. Есть что-то типа пула вспомогательных потоков, (принадлежат классу Контроллера), который занимаются непосредственно расчетами. В "Визуализаторе" предусмотрен диалог с настройками, по выходу из которого старый Контроллер уничтожается и создается новый экземпляр с новыми настройками. И вот у меня не получается корректно уничтожить экземпляр Контроллера((((( В методе, который запускается в потоке, есть булевский флаг, который контролирует цикл
Манипуляции с executeMutex - это попытки как-то разобраться/понять, почему изменение флага m_bTerminate не приводит к завершению цикла (не вызывается m_pView->OnControllerTerminate() Сам проект писан на C++ +wxWidgets. Могу выложить, если нужно.
0
|
|||||||||||
| 30.09.2023, 14:04 | |
|
Ответы с готовыми решениями:
50
Прошу подсказки Прошу подсказки прошу подсказки |
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 01.10.2023, 14:48 [ТС] | ||
|
В связи с этим вопрос - в поисках косяка я заменил лямбду на вызов метода. Есть ли здесь принципиальная разница (с учетом того, что нужно захватывать this)? Или лямбда просто для экономии кода и времени?
0
|
||
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 908
|
||
| 01.10.2023, 16:07 | ||
|
Иначе компилятор оптимизирует код и не считывает её из памяти
0
|
||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
|||
| 01.10.2023, 18:56 | |||
|
А так - на здоровье Aledveu, а он, что ли, мысленное считывание делает?
0
|
|||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 01.10.2023, 19:30 [ТС] | ||
|
0
|
||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
|
| 01.10.2023, 19:39 | |
|
Constcat, переменная используется
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 01.10.2023, 20:33 [ТС] | ||
|
В основном потоке я ей присваиваю значение. А оно остается старым. В том же потоке.
0
|
||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
|
| 02.10.2023, 06:06 | |
|
Constcat, либо её содержимое где-то меняется, либо это разные переменные
Добавлено через 13 секунд код покажи хотя бы
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
| 02.10.2023, 08:42 [ТС] | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 02.10.2023, 09:22 | |
|
Constcat, скриншоты, да еще и такие обрывочные - это издевательство.
Нормально код показывайте, текстом и полностью. Там любая мелочь (в том числе та, которую вы считаете мелочью) может иметь значение.
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||||||||||||||||
| 02.10.2023, 09:47 [ТС] | |||||||||||||||||
|
Но если вкратце: 1. Переменная static bool m_bTerminate была объявлена в хедере класса Контроллера. 2. Один из методов этого класса (Execute(), где крутился рабочий цикл с проверкой (m_bTerminate) запускался в фоновом потоке из экземпляра класса Визуализатора. 3. Метод Terminate(), где изменялся флаг m_bTerminate, запускался из Визуализатора в основном потоке. Схематично это выглядело примерно так: Хедер класса Контроллер:
На скриншотах показано, что при присвоении флагу m_bTerminate = true и входу в метод m_pController->Terminate(), этот же флаг содержит false. Переменная m_bTerminate - единственная, это 100%. Описана в одном-единственном хедере с #pragma once.
0
|
|||||||||||||||||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
||||||||||
| 02.10.2023, 09:53 | ||||||||||
|
Кроме того, где синхронизация то? Добавлено через 33 секунды ![]() Добавлено через 1 минуту вот это, если оно так и будет лежать в хедере на том же месте,
0
|
||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 02.10.2023, 09:57 | ||||
|
С ходу в том, что вы показали, неправильно только что m_bTerminate используется без синхронизации. Это может приводить к "кешированию" значения m_bTerminate, и, соответственно, некорректной работе.С другой стороны вы выше писали, что пробовали std::atomic в этой роли, что при отсутствии недосказанностей должно было решить проблему. Однако раз оно проблему не решило, значит недосказанности были. А какие они были мы теперь не узнаем. Так что нет, нельзя тут ничего сказать (кроме разве что "используйте гит, чтобы можно было смотреть прежние версии кода в таких ситуациях"). Добавлено через 1 минуту Ну так да, теперь все понятно ![]() Добавлено через 3 минуты Алексей1153, У меня как-то подобные действия ну никак не смогли ассоциироваться с глобальным static. Еще ведь и m_ написано!Автор, у меня слов нет
0
|
||||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
||
| 02.10.2023, 10:02 | ||
|
DrOffset, да, я бы дал такой переменной имя навроде
global_sync_bTerminateControllerThreadДобавлено через 1 минуту Constcat, при этом, я ж пример даже давал. Без всяких глобальных переменных
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||||||||
| 02.10.2023, 10:09 [ТС] | ||||||||
|
Принципиальные отличия (как мне кажется) старого и нового кода в следующем: 1. Контроллер в Визуализаторе описан, как std::unique_ptr (а не просто указатель на CController) 2. Запуск Execute() в потоке выполняется изнутри класса Контроллера (а не снаружи, из Визуализатора) Но вот такие эксперименты не сохраняю. Я за сутки по несколько раз архитектуру исправляю, с кучей экспериментов. Когда все это начинаешь сохранять, путаешься что, зачем, нафига и пр.))))) Фиксирую уже более-менее рабочий вариант. Добавлено через 3 минуты В процессе экспериментов и goto можно понапихивать для проверки различных ситуаций. Понятно, что в финальный вариант оно не попадет))) Добавлено через 1 минуту Просто по просьбе DrOffset, на скорую руку по памяти накарябал образец старого кода. Добавлено через 1 минуту Я понимаю, что у меня могут быть пробелы в теории, но хедер же включается один раз?
0
|
||||||||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
|||
| 02.10.2023, 10:12 | |||
cpp
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||
| 02.10.2023, 10:14 | ||||
|
К сожалению слишком часто сталкиваюсь с этими явлениями на практике, чтобы просто промолчать.
0
|
||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 02.10.2023, 10:14 [ТС] | |||
|
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 02.10.2023, 10:15 | ||
|
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 02.10.2023, 10:16 [ТС] | ||
|
И пробелов в таких случаях я стараюсь не оставлять.
0
|
||
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
||
| 02.10.2023, 10:16 | ||
static чегототам; с внутренним связыванием. Разные экземпляры. У них разный адрес
1
|
||
| 02.10.2023, 10:16 | |
|
Прошу подсказки Прошу подсказки и консультации Прошу подсказки новичку Прошу подсказки по MVC и соединению с БД Прошу подсказки - определиться с идеологией Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
https:/ / youtu. be/ VpfFZSUDGnQ. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|