Если у вас есть очередь/FIFO с несколькими производителями/одним потребителем, вы можете легко создать одну LockFree, используя SLIST или тривиальный стек Lock Free LIFO. Что вы делаете, так это имеете второй «частный» стек для потребителя (который также может быть выполнен как SLIST для простоты или любой другой модели стека, которую вы выберете). Потребитель выталкивает элементы из частного стека. Всякий раз, когда частный LIFO исчерпан, вы выполняете Flush, а не Pop из общего параллельного SLIST (захватывая всю цепочку SLIST), а затем проходите по сброшенному списку по порядку, помещая элементы в частный стек.
Это работает для одного производителя / одного потребителя и для нескольких производителей / одного потребителя.
Однако он не работает для случаев с несколькими потребителями (как с одним производителем, так и с несколькими производителями).
Кроме того, что касается хеш-таблиц, они являются идеальным кандидатом для «чередования», которое просто делит хэш на сегменты, имеющие блокировку для каждого сегмента кеша. Вот как это делает параллельная библиотека Java (используя 32 полосы). Если у вас есть облегченная блокировка чтения-записи, к хеш-таблице можно одновременно обращаться для одновременного чтения, и вы остановитесь только тогда, когда запись происходит на оспариваемые полосы (и, возможно, если вы разрешите увеличение хеш-таблицы).
Если вы создаете свои собственные, не забудьте чередовать свои блокировки с хеш-записями, а не помещать все свои блокировки в массив рядом друг с другом, чтобы свести к минимуму вероятность ложного совместного использования.
person
Adisak
schedule
09.10.2009