#multithreading #architecture #synchronization #shared-resource
#многопоточность #архитектура #синхронизация #общий ресурс
Вопрос:
У меня проблема с курицей или яйцом с многопоточностью и синхронизацией общих ресурсов, и в настоящее время она потеряна, и я прошу вас о помощи. Вот мое условие.
[Условие 1]
- Существуют общие ресурсы, которые совместно используются в рамках процесса.
- Общие ресурсы управляются классом manager.
- Классы менеджеров имеют потокобезопасные функции для управления ресурсами. (например, Добавление/Удаление/Получение )
- Потокобезопасность достигается путем блокировки доступа к общему ресурсу в зависимости от того, какой поток входит первым.
- Всякий раз, когда каждому потоку требуется общий ресурс, он получает его, вызывая функцию класса менеджера. (Проблема узкого места)
Чтобы решить эту проблему, я пришел к мысли о том, чтобы заранее получить все текущие ресурсы по массиву от менеджера.
[Условие 2]
- Поток (Основной) обращается ко всем менеджерам и получает все ресурсы до начала других потоков.
- Каждый другой поток обрабатывает «заданные ресурсы». (Каждый «данный ресурс» для потока не является общим для потоков)
- Теперь проблема узкого места исчезла. (Технически узкое место не исчезло, просто этапы работы «разделены») Однако возникает 2 проблемы.
- Потокобезопасные инструкции в менеджерах стали бесполезными накладными расходами.
- Все проверки условий в каждом потоке стали технически бесполезными.
Проблема 2 подробно
- Поток A обрабатывает значение null для «данного ресурса», оно не равно нулю.
- ЕСЛИ поток B вызывает и удаляет данный ресурс из менеджера,
- Поток A продолжает обработку с ненулевым ресурсом, который на самом деле равен нулю, что является критической ошибкой.
В этот момент я пришел к мысли, что все, что имеет значение, — это когда синхронизировать.
Кроме того, вышеупомянутая проблема 2 уже была открыта в условии 1, потому что ресурс, указанный в точке, был действителен, но после этого момента, после этого нет никакой гарантии действительности ресурса.
Мой вопрос в том, как вы справляетесь с этой проблемой?
До сих пор я доходил до того, что «все, что имеет значение, — это когда синхронизировать».
Но это означает, что необходимо зафиксировать время обработки нескольких потоков. Тогда все эти блокировки или атомы не нужны.
Комментарии:
1. За вашей проблемой трудно следить, не могли бы вы добавить код для воспроизведения проблемы?