Учитывая мое отсутствие знаний о С ++, попробуйте прочитать мои намерения, а не мой плохой технический вопрос.
Это основа моей программы 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% в порядке, когда пользователи читают из старого массива, пока строится другой, но я абсолютно не хочу, чтобы их чтение или запись потока когда-либо заканчивались ошибкой / блокировались.
Существует ли массив без блокировки? Если нет, есть ли способ построить новый массив во временном массиве, а затем записать его в реальный массив, когда сборка будет завершена без блокировки & блокирование?
Вы смотрели на Boost.Lockfree?
Э-э-э-э Сложно.
Посмотрите здесь (для примера): РКО — и это только о многократных чтениях наряду с ОДНОЙ записью.
Я предполагаю, что несколько писателей не собираются работать. Вы должны скорее искать более эффективное представление, чем массив, который позволяет быстрее обновлять. Как насчет сбалансированного дерева? log (n) никогда не должен блокировать что-либо заметным образом.
Что касается boost — я счастлив, что наконец-то появилась надлежащая поддержка синхронизации потоков.
Конечно, вы также можете сохранить копию и пакетные обновления. Затем фоновый процесс объединяет обновления и копирует результат для читателей.