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