Есть ли производство готовая очередь без блокировок или реализация хеша в [закрытом] C++

Вы хотите vars() смешанный с pprint():

from pprint import pprint
pprint(vars(your_object))
77
задан RED SOFT ADAIR 29 July 2009 в 13:26
поделиться

9 ответов

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

1
ответ дан 24 November 2019 в 10:56
поделиться

А потом появились Intel Threading Building Blocks . И какое-то время это было хорошо.

PS: вы ищете concurrent_queue и concurrent_hash_map

3
ответ дан 24 November 2019 в 10:56
поделиться

Отправной точкой может быть любая из статей Херба Саттера DDJ для одного производителя и потребителя или нескольких . Код, который он дает (встроенный, начиная со второй страницы каждой статьи), использует тип шаблона atomic в стиле C ++ 0x; который вы можете имитировать, используя межпроцессную библиотеку Boost.

Код повышения скрыт в глубине межпроцессной библиотеки, но после прочтения соответствующего заголовочного файла (atomic.hpp) реализации необходимых операций сравнения и замены на знакомых мне системах внешний вид звука.

25
ответ дан 24 November 2019 в 10:56
поделиться

boost.lockfree - это попытка создать c ++ реализации стека lockfree и классов fifo.

публичный репозиторий git

10
ответ дан 24 November 2019 в 10:56
поделиться

After having checked most of the given answers, i can only state:

The answer is NO.

There is no such thing right that could be used right out of the box.

10
ответ дан 24 November 2019 в 10:56
поделиться

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

Это работает для одиночных операций. производитель / один-потребитель и для нескольких производителей / одного потребителя.

Однако это не работает для случаев с несколькими потребителями (с одним производителем или несколькими производителями).

Также, что касается хеширования столы идут, они являются идеальным кандидатом для «чередования», при котором хэш просто разделяется на сегменты, имеющие блокировку на сегменты кеша. Вот как это делает параллельная библиотека Java (с использованием 32 полос). Если у вас есть облегченная блокировка чтения-записи, к хеш-таблице можно получить одновременный доступ для одновременного чтения, и вы остановитесь только тогда, когда запись происходит на оспариваемых полосах (и, возможно, если вы разрешите увеличение хеш-таблицы).

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

5
ответ дан 24 November 2019 в 10:56
поделиться

Самое близкое, что мне известно, - это заблокированные односвязные списки Windows . Конечно, это только Windows.

6
ответ дан 24 November 2019 в 10:56
поделиться

Есть такой библиотека, но она на C.

Перенос в C ++ должен быть простым.

http://www.liblfds.org

11
ответ дан 24 November 2019 в 10:56
поделиться

I found another solution written in c:

http://www.ddj.com/hpc-high-performance-computing/219500200

0
ответ дан 24 November 2019 в 10:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: