Привет.
Подскажите, какую структуру данных лучше взять для достаточно типичной задачи: есть множество коллбэков, необходимо удалять/добавлять новые (write доступ), вызывать их в цикле (read доступ), всё это в многопотоке и с условием, что коллбэк внутри себя может стриггерить удаление/добавление другого коллбэка. Хранятся они по уникальным ключам, удаляются по ним же.
Пока что в голову лезет достаточно жуткое решение с тремя пулами (current
, items_to_add
, items_to_remove
) под тремя мьютексами и нетривиальной логикой. Но я уверен, что есть какие-то общепринятые практики
мб я что-то упускаю, но вроде достаточно просто лок-фри получается.
если колбеков не очень много, то ответ: лок-фри лист. добавлять\удалять\итерироваться можно.
если колбеков настолько много, что бежать по списку для поиска становится дорого, то если вообще не думать, то можно просто завести мэппинг для того чтобы запоминать указатель на позицию в списке и делать удаление\добавление за О(1) а не за О(н), но уже с мютексом для доступа к этому мэпу. если мэппинг становится узким местом, то, если совсем не думать, его можно разбивать на бакеты, в каждом из которых свой мютекс. хотя для этого наверняка что-то есть более изящное