Один из подходов, который не является широко используемым, но вполне обоснованным, состоит в том, чтобы назначить один поток специального назначения для управления каждой «разделяемой» структурой. Этот поток обычно ожидает в очереди (потокобезопасен ;-), например, в Python экземпляр Queue.Queue
для рабочих запросов (чтение или изменение общей структуры), включая как те, которые запрашивают ответ (они передадут собственную очередь, в которую ответ будет помещен, когда будет готов), так и те, которые не делают , Этот подход полностью сериализует весь доступ к общему ресурсу, легко переназначает многопроцессную или распределенную архитектуру (почти бездумно, в Python, с multiprocessing
;-), и абсолютно гарантирует надежность и отсутствие взаимоблокировок, а также условия гонки. пока базовый объект очереди хорошо запрограммирован раз и навсегда.
По сути, он превращает ад общих структур данных в рай архитектуры параллелизма с передачей сообщений.
OTOH, это может быть чуть-чуть выше, чем тяжелый путь с помощью замков & c; -).