Имеется некоторый контейнер, содержащий в себе указатели на экземпляры пользовательского класса. Также, имеется 1 поток (назовём его модификатор), добавляющий и удаляющий элементы контейнера и N потоков, делающих обход элементов и производящих с ними определённые действия (назовём их хэндлерами). Задача заключается в том, чтобы сделать данный контейнер потокобезопасным и при этом обеспечить модификатору приоритетный доступ к контейнеру. То есть, если хэндлеры в количестве K штук ожидают доступа к контейнеру и в этот момент доступ запрашивает модификатор, то необходимо переместить модификатор в начало очереди ожидания и предоставить ему доступ первым.
Dead_Bit , а тебя не напрягает тот факт, что такая организация на N хендлеров является крайне недружелюбной к MESI и L1? Кэшмиссами не просто попахивает, а прямо таки за версту разит.
Может быть тебе стоит подумать над изменением архитектуры хранения своих объектов в целом? Так и подход tsarevfs станет для тебя более понятным.
Посмотрите на библиотеку для очереди задач https://github.com/seanmiddleditch/jobxx/blob/deve...
Может это и есть то что вам нужно.
Основная идея в том, что мы не блокируем очередь надолго, это значит что "модификатор" всегда сможет положить туда новую задачу почти без ожидания.
Спасибо за наводку, но, к сожалению, это не то. Элементы в моём контейнере удаляются и добавляются беспорядочно одним потоком. Я долго искал информацию о том, какая сложность у полного обхода элементов у различных контейнеров, в итоге нашёл лишь комментарий на одном из форумов о том, что при использовании итераторов сложность обхода у всех контейнеров STL одинакова и равна O(N). Если это правда, то в моей задаче нужно скорее множество, нежели очередь. То есть "модификатор" добавляет и удаляет оттуда элементы, при этом должна сохранятся синхронизация с хэндлерами, которые эти элементы обрабатывают, полностью обходя контейнер.