Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: rudireg от Ноябрь 18, 2016, 10:49



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

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

update
Или нужно семафор создавать в потоке В? То есть создать семафор лишь для тех ресурсов, что были отданы потоку В? Тогда можно смело по порядку обрабатывать.


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


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

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


Название: Re: QSemaphore - его использование
Отправлено: Igors от Ноябрь 18, 2016, 11:51
..самый оптимальный вариант - иметь флаг занятости...  :D
Для этого размер эл-та QList должен быть > sizeof(void), тогда эл-ты не перемещаемы. Также установка флага должна быть защищена мутексом, тем же что и удаление. Не очень привлекательный вариант, напр take + атомарный лок смотрится лучше