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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Массив буферов producer - customer  (Прочитано 3168 раз)
ti0
Новичок

Offline Offline

Сообщений: 38


Просмотр профиля
« : Август 03, 2020, 10:36 »

Не могу никак сообразить архитектуру. Есть класс кольцевого буфера. Запись и чтение из которого осущесттвляется с разных потоков. Для синхронизации используется
QWaitCondition и QMutex. Они находятся в классе буфера. Все отлично работает. Но логика приложения усложнилась. Потоки producer и customer могут создаваться в процессе работы программы, при этом взаимосвязь между ними может быть любая. например, может быть конфигурация 1 producer -> buffer -> 2 customer, и одновременно с этим еще 1 producer -> buffer -> 1 customer. Итого у нас 2 кольцевых буфера. Я создал класс BufferManager, где начал использовать QMap<буфер>, но QMap никак не защищен, потому что если использовать QMutex, получается deadlock, когда customer ждет данных, а producer не может их записать, так как QMutex заблокирован customer. Как мне защитить QMap?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Август 03, 2020, 16:37 »

предлагаю замутить сигнал readyRead, как сделано в QTcpSocket
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 04, 2020, 13:31 »

Для синхронизации используется QWaitCondition и QMutex.
Не "ошибка" но "тревожный симптом". Лучше обойтись чисто сигналами без низкоуровневых примитивов синхронизации.

Но логика приложения усложнилась. Потоки producer и customer могут создаваться в процессе работы программы, при этом взаимосвязь между ними может быть любая. например, может быть конфигурация 1 producer -> buffer -> 2 customer, и одновременно с этим еще 1 producer -> buffer -> 1 customer. Итого у нас 2 кольцевых буфера. Я создал класс BufferManager, где начал использовать QMap<буфер>, но QMap никак не защищен, потому что если использовать QMutex, получается deadlock, когда customer ждет данных, а producer не может их записать, так как QMutex заблокирован customer. Как мне защитить QMap?
Есть "дешевое" решение: заранее создать все буфера и поместить их в QMap. Тогда конкурентный доступ к ней ничем не грозит. Если так не выходит, нужно ставить "свой" QReadWriteLock на эту мапу
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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