2014-11-05 5 views
0

Есть ли реализация (повышение или иное) сильно параллельного детекса? В частности, я хочу, чтобы иметь возможность сказать что-то вроде этого (псевдокод):Высокопараллельный deque

parallel.for(deque.erase, list<locations>); 

Другими словами, параллельно удалить все элементы, передаваемые в, например, Список мест в deque. В то же время я не хочу, чтобы эта операция блокировала другие удаления или вставки, которые не имеют никакого отношения к этому удалению/вставке.

Так, например, нить 1 может быть (параллельной) удалять элементы в местах 1,3,7,9, поток 2 (параллельно), вставляемый в deque (параллельные вставки могут быть push_back и кажутся легкими, если не пытаться вставить в старые удаленные местоположения), а три потока могут быть (параллельными) удалением местоположений 2,4,8 [обратите внимание, что разные стирания нитей не пересекаются с местами стирания]. Попытка стереть уже стертое местоположение (удерживая значение дозорного) - это ошибка. Вероятно, это означает, что местоположения являются состояниями до тех пор, пока не произойдет какое-то уплотнение (для чего требуется блокировка). Удаленные местоположения могут содержать значение дозорного значения, которое говорит другим потокам, которые вы можете вставить мне ... Таким образом, интерфейс может быть не push_back, а push_available.

мышление жар угас, я понимаю, что Deque может фрагментируется и расти (утечка памяти), как push_backs не заполняют стертые значения (?), Но какое-то уплотнение представляется возможным в конце концов.

Paralell_deque также должен разрешить блокировку, если до тех пор, пока блокировка не будет удалена, не будут удалены никакие вставки или удаления. Например, при печати состояния (содержимого) дека ...

У deque может быть несколько стратегий для реализации, а некоторые могут быть более поддающимися, чем другие, для такого рода параллелизма.

Я также понимаю, что этот вопрос может быть слишком расплывчатым и сбиваться до того, как будут даны интересные ответы.

+3

Я немного смущен вашим использованием слова «deque». Обычно эта структура данных не поддерживает вставки и удаления в случайных позициях, но только с обоих концов. Вы ищете двойной список? В [Boost.Lockfree] есть некоторые блокированные структуры данных (http://www.boost.org/doc/libs/1_57_0/doc/html/lockfree.html), но не зная, какие операции вам действительно нужны, сложно скажите, может ли любой из них (возможно, в сочетании) соответствовать вашим потребностям. – 5gon12eder

+0

Этот вопрос немного странный, потому что вы, как правило, не хотите деактивировать, если вы добавляете и вычитаете из произвольных мест, вам нужен список. Этот вопрос очень похож на [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Существуют [параллельные реализации очередей] (https://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html), но они действительно не работают таким образом вы описываете. – QuestionC

+0

@QuestionC, хотя очереди, на которые вы ссылаетесь, специально делают все остальные операции в блоке очереди всякий раз, когда они модифицируются – sehe

ответ

2

Похоже, что вам действительно нужен контейнер на основе узлов (который не делает недействительными итераторы), но со смежным хранилищем.

Я предлагаю создать связанный список поверх смежных хранимых элементов, используя Boost Intrusive.

Однако до этого я бы проживал с простейшей структурой данных, о которой вы можете думать, пока не найдете do знаете, что именно вы хотите и почему.

Смежные вопросы