(желательно буст) массив без блокировки / вектор / карта / и т.д?

Учитывая мое отсутствие знаний о С ++, попробуйте прочитать мои намерения, а не мой плохой технический вопрос.

Это основа моей программы https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

Я создаю сервер websocket с помощью websocket ++ (а это очень мило с websocket ++. Я очень рекомендую), и я могу легко манипулировать потоком данных каждого пользователя безопасно, потому что им действительно не нужно манипулировать различными потоками; Тем не менее, я хочу иметь возможность записи в массив (я собираюсь использовать универсальный термин «массив» из более слабых языков, таких как vb, php, js) в одном потоке функций (с несколькими итерациями, которые могут выполняться одновременно), а также читать в 1 или более тем.

Возьмите стек в качестве примера: если бы я хотел иметь все idс (PRIMARY колонка всех статей), отсортированная особым образом, в данном случае по чистым голосам, и сохраненная в памяти, я думаю, у меня была бы функция, которая вызывается по-своему boost::thread, запускается всякий раз, когда приходит голосование на сайте, чтобы изменить порядок в массиве.

Как я могу сделать это без блокировки & блокирование? Я на 100% в порядке, когда пользователи читают из старого массива, пока строится другой, но я абсолютно не хочу, чтобы их чтение или запись потока когда-либо заканчивались ошибкой / блокировались.

Существует ли массив без блокировки? Если нет, есть ли способ построить новый массив во временном массиве, а затем записать его в реальный массив, когда сборка будет завершена без блокировки & блокирование?

1

Решение

Вы смотрели на Boost.Lockfree?

4

Другие решения

Э-э-э-э Сложно.

Посмотрите здесь (для примера): РКО — и это только о многократных чтениях наряду с ОДНОЙ записью.

Я предполагаю, что несколько писателей не собираются работать. Вы должны скорее искать более эффективное представление, чем массив, который позволяет быстрее обновлять. Как насчет сбалансированного дерева? log (n) никогда не должен блокировать что-либо заметным образом.

Что касается boost — я счастлив, что наконец-то появилась надлежащая поддержка синхронизации потоков.

Конечно, вы также можете сохранить копию и пакетные обновления. Затем фоновый процесс объединяет обновления и копирует результат для читателей.

1

По вопросам рекламы [email protected]