Позвольте использовать в качестве примера стандартное дерево двоичного поиска, его узлы имеют инкапсулированное значение и указатели на левого и правого потомков и его родителя. Его основными методами являются addNode()
, removeNode()
и searchNode()
.
Я хочу понять, как сделать мою структуру данных безопасной. Я, однако, не очень разбираюсь в безопасности потоков и хочу спросить, верно ли то, что я думаю, или нет.
Моя первая проблема - это решение: что я хочу сделать, когда у меня есть параллельные методы? Допустим, я использую свой BST для управления картой в игре: позиция персонажа игрока представлена массивом double
s, я сохраняю позиции игрока в моем BST в лексикографическом порядке. Один игрок уничтожил цель (и его поток хочет удалить ее с моей карты), но другой игрок начинает атаку и ему нужен список всех возможных целей на определенном расстоянии от него, включая только что удаленную цель (и его поток хочет выполнить поиск, который будет включать в себя цель). Как мне справиться с ситуацией? А как насчет других ситуаций?
Моя вторая проблема, (я думаю) моя самая большая, связана с приведением в действие: как я могу добиться того, чего хочу. Я читал о таких вещах, как атомарные операции, линейность, без препятствий, без блокировок, без ожидания. Я никогда не обнаруживал в одном месте простого определения для каждого, преимуществ этой стратегии, недостатков. Что это за вещи? Что я делаю, если я блокирую узлы, или если я блокирую указатели на другие узлы, или значения инкапсулируются в узле?
Правильно ли я понимаю проблему безопасности потоков? У вас есть предложения по проблемам, о которых мне следует подумать, или по письменным документам и документам в формате pdf, которые я должен прочитать, чтобы лучше понять проблемы и их многочисленные решения?