Синхронизация общих ресурсов с несколькими потоками

#multithreading #architecture #synchronization #shared-resource

#многопоточность #архитектура #синхронизация #общий ресурс

Вопрос:

У меня проблема с курицей или яйцом с многопоточностью и синхронизацией общих ресурсов, и в настоящее время она потеряна, и я прошу вас о помощи. Вот мое условие.

[Условие 1]

  • Существуют общие ресурсы, которые совместно используются в рамках процесса.
  • Общие ресурсы управляются классом manager.
  • Классы менеджеров имеют потокобезопасные функции для управления ресурсами. (например, Добавление/Удаление/Получение )
  • Потокобезопасность достигается путем блокировки доступа к общему ресурсу в зависимости от того, какой поток входит первым.
  • Всякий раз, когда каждому потоку требуется общий ресурс, он получает его, вызывая функцию класса менеджера. (Проблема узкого места)

Чтобы решить эту проблему, я пришел к мысли о том, чтобы заранее получить все текущие ресурсы по массиву от менеджера.

[Условие 2]

  • Поток (Основной) обращается ко всем менеджерам и получает все ресурсы до начала других потоков.
  • Каждый другой поток обрабатывает «заданные ресурсы». (Каждый «данный ресурс» для потока не является общим для потоков)
  • Теперь проблема узкого места исчезла. (Технически узкое место не исчезло, просто этапы работы «разделены») Однако возникает 2 проблемы.
  1. Потокобезопасные инструкции в менеджерах стали бесполезными накладными расходами.
  2. Все проверки условий в каждом потоке стали технически бесполезными.

Проблема 2 подробно

  • Поток A обрабатывает значение null для «данного ресурса», оно не равно нулю.
  • ЕСЛИ поток B вызывает и удаляет данный ресурс из менеджера,
  • Поток A продолжает обработку с ненулевым ресурсом, который на самом деле равен нулю, что является критической ошибкой.

В этот момент я пришел к мысли, что все, что имеет значение, — это когда синхронизировать.

Кроме того, вышеупомянутая проблема 2 уже была открыта в условии 1, потому что ресурс, указанный в точке, был действителен, но после этого момента, после этого нет никакой гарантии действительности ресурса.

Мой вопрос в том, как вы справляетесь с этой проблемой?

До сих пор я доходил до того, что «все, что имеет значение, — это когда синхронизировать».

Но это означает, что необходимо зафиксировать время обработки нескольких потоков. Тогда все эти блокировки или атомы не нужны.

Комментарии:

1. За вашей проблемой трудно следить, не могли бы вы добавить код для воспроизведения проблемы?