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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSemaphore - его использование  (Прочитано 3143 раз)
rudireg
Гость
« : Ноябрь 18, 2016, 10:49 »

Привет.
Есть 2 потока, поток А и поток В.
Есть массив ресурсов QList (ресурс содержит например 100 элементов) который физически расположен в потоке А, а поток B получает указатели на элементы ресурса для работы с ними.
Поток В выборочно получает в обработку несколько элементов рессурса (не по порядку а например: 1 элемент, 5-ый, 46-ой и 78-ой),
после получения ресурсов, поток В начинает по порядку их обрабатывать в постоянном цикле.
И теперь поток А решил удалить пару ресурсов, указатели на которые были отданы потоку В.
Что мы имеем... есть ресурсы, доступ к которым хотят получить 2 потока. И если поток А удалит ресурс, то поток В может словить ошибку, если во время удаления ресурса он с ним ещё работал...
Иными словами тут нужен семафор, что бы поток A не мог удалить ресурс, если с ним еще работает поток В.

Вопрос: Как благодяря QSemaphore поток А узнает какой именно ресурс обрабатывается потоком B в данный момент времени?
У нас же 100 ресурсов, и потоку В дали в работу лишь несколько в случайном порядке...
Семафор делает инкремент и декремент, (++, --), но этих операциях подразумевается последовательная обработка всех ресурсов, а мы отдали выборочно !!! например 1-ый 5-ый и 35-ый.

update
Или нужно семафор создавать в потоке В? То есть создать семафор лишь для тех ресурсов, что были отданы потоку В? Тогда можно смело по порядку обрабатывать.
« Последнее редактирование: Ноябрь 18, 2016, 10:57 от rudireg » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Ноябрь 18, 2016, 11:00 »

Не могут никакие ресурсы физически жить в каких то потока. У процесса одно адресное пространство и все потоки его разделяют.
Также не очень понятно, что вы имеите ввиду под ресурсом? Если поток B начинает обрабатывать "ресурсы", то это скорее задания.
Задания-ресурсы всегда можно переложить из массива ресурсов потока А, в другой массив потока B, тогда поток А ничего удалить не сможет. Или добавить в ресурс флаг занятости, тогда если он будет установлен, то поток А не будет его удалять.
Записан
rudireg
Гость
« Ответ #2 : Ноябрь 18, 2016, 11:08 »

Не могут никакие ресурсы физически жить в каких то потока. У процесса одно адресное пространство и все потоки его разделяют.
Также не очень понятно, что вы имеите ввиду под ресурсом? Если поток B начинает обрабатывать "ресурсы", то это скорее задания.
Задания-ресурсы всегда можно переложить из массива ресурсов потока А, в другой массив потока B, тогда поток А ничего удалить не сможет. Или добавить в ресурс флаг занятости, тогда если он будет установлен, то поток А не будет его удалять.

Русурсы  - это массив структур анкет соц. сети. (Флаг занятости - действительно можно сделать  Смеющийся)
Поток В работает с ресурсами, покуда есть наличие этих ресурсов.
Поток А решает, когда удалить ресурс.
Думаю вы правы, самый оптимальный вариант - иметь флаг занятости...  Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Ноябрь 18, 2016, 11:51 »

..самый оптимальный вариант - иметь флаг занятости...  Веселый
Для этого размер эл-та QList должен быть > sizeof(void), тогда эл-ты не перемещаемы. Также установка флага должна быть защищена мутексом, тем же что и удаление. Не очень привлекательный вариант, напр take + атомарный лок смотрится лучше
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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