Название: 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 + атомарный лок смотрится лучше |