Russian Qt Forum
Июнь 22, 2024, 17:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Глобальная переменная в потоках  (Прочитано 3995 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Декабрь 22, 2022, 10:01 »

Коллеги,
вопрос про азы многопотокового программирования. Думаю, что ответ простой и очевидный ))
Есть глобальная булевая переменная COptions::profilerIsActive.
Переменная может изменяться из разных потоков с использованием мьютекса, например:
Код
C++ (Qt)
{
   QMutexLocker locker(&mutex);
   COptions::profilerIsActive = true;
...
}
 
Она используется в качестве флага для эмитирования сигнала вот так, без блокировки:
Код
C++ (Qt)
   if(COptions::profilerIsActive) {
       emit profilerSig(1, vars.unitId, requestId, QDateTime::currentMSecsSinceEpoch(), vars.hasError(), queueLength());
   }
 
Вопрос: если в момент чтения переменной выполняется ее изменение, может ли это привести к краху программы? То, что я могу прочитать недостоверное значение, меня не волнует - на следующем цикле прочту истинное значение и запущу или остановлю испускание сигнала.

« Последнее редактирование: Декабрь 30, 2022, 13:22 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Декабрь 22, 2022, 10:26 »

Добавлю еще вопрос: как оценить ресурсоемкость мьютекса на чтение? В первую очередь, его быстродействие.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4733



Просмотр профиля WWW
« Ответ #2 : Декабрь 22, 2022, 11:05 »

краха не будет

для производительности можно попробовать заменить мьютекс на QAtomicInteger<bool>, если это подойдет
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Декабрь 22, 2022, 12:06 »

Да, я об этом думал. Но мне не критична целостность этой переменной, поэтому не стал усложнять. Спасибо.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #4 : Декабрь 22, 2022, 22:56 »

если достоверность profilerIsActive не сильно важна, то мутекс вообще можно убрать

и чтобы два раз не вставать, тут https://www.youtube.com/watch?v=dFEBrGJ8j2w&list=PL3BR09unfgcgJPQZKaacwzGmcXMtEA-19&index=20 умный дядька Konstantin Vladimirov как раз про потоки вещает
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Декабрь 23, 2022, 10:55 »

если достоверность profilerIsActive не сильно важна, то мутекс вообще можно убрать


нельзя
если не важно значение то это томик с relaxed memory order.
чтение без синхронизации - ub
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Декабрь 23, 2022, 13:28 »

Уточню.
если достоверность profilerIsActive не сильно важна, то мутекс вообще можно убрать
Нельзя. Потому что одновременная запись - это, как уже сказано, UB. Неопределенность я понимаю в широком смысле: если несколько потоков пишут туда true, то состояние переменной может оказаться каким угодно, например, false (хотя откуда оно там возьмется? Улыбающийся).
А вот при чтении, в моем конкретном случае, UB не сильно беспокоит. Ну один раз я прочту не то, что на самом деле должно быть в переменной, это приведет к тому, что либо будет пропущен сигнал или, наоборот, будет эмитирован лишний. Именно в моей задаче это не принципиально.
Спасибо всем.
« Последнее редактирование: Декабрь 23, 2022, 13:33 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Декабрь 23, 2022, 15:57 »

Ub в данном случае может вылиться в if (false) или if (true)
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #8 : Декабрь 23, 2022, 18:01 »

Ub в данном случае может вылиться в if (false) или if (true)

а т.к. для ТС не сильно важно это, то можно
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Декабрь 27, 2022, 00:59 »

Ub в данном случае может вылиться в if (false) или if (true)

а т.к. для ТС не сильно важно это, то можно


не важно не удалит ли его код компилятор? тогда зачем этот код нужен?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #10 : Декабрь 27, 2022, 09:16 »

не важно не удалит ли его код компилятор? тогда зачем этот код нужен?
Это единственное, что меня напрягает. Но все работает...
А если использовать волшебное "volatile", этого достаточно?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Декабрь 30, 2022, 11:54 »

достаточно использовать волшебный atomic_bool
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Декабрь 30, 2022, 13:22 »

Как я уже упомянул, синхронизация при чтении меня не особо заботит - процесс циклический и пропуск или, наоборот, лишний сигнал не помешает. Нужно лишь включить или выключить профайлер.
Поэтому atomic_bool по сравнению с volatile мне видится чересчур "достаточным" Подмигивающий
Впрочем, простая с виду тема затянулась, и это чревато тем, что не все начинают заглядывать, с чего все начиналось.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 23.