Я пытаюсь разработать приложение, состоящее из пула потоков, использующее алгоритм кражи работы для одновременного выполнения задач.
Эти задачи
- доступ к предопределенному набору объектов;
- должен "атомарно" получить права на чтение / запись для всех объектов, к которым он обращается, прежде чем он будет запущен;
- по окончании (и гарантированно в конце концов) отпустят приобретенные объекты.
Один из возможных способов решения этой проблемы - каждый поток выбирает задачу по очереди, а затем пытается заблокировать каждый из объектов в предопределенном порядке. Если хотя бы один из них вышел из строя, снимите все блокировки и перейдите к другой задаче.
Этот метод, однако, увеличивает вероятность нехватки заданий с большими объектными зависимостями и может даже повлечь за собой живые блокировки.
Есть ли другой метод получения набора блокировок при максимальном параллелизме? (без глобальной блокировки) Или, возможно, изменить систему так, чтобы она больше не требовалась?
Если так, то есть какие-нибудь хорошие статьи об этом?
пс: Как ответил Титон, это обобщенная версия проблемы «столовых философов». Я ищу нецентрализованные решения, в частности алгоритмы, которые хорошо справляются с высокой нагрузкой (добавление и удаление задач).