Мой вопрос похож на эту тему, однако я уверен, что вывод, сделанный в данной теме, применим здесь.
Мой вариант использования: в приложении есть поток состояния, который отправляет одну и ту же текстовую информацию каждые 1 секунду. Текстовая информация содержит имя группы приложений. Этот статус используется средством чтения статуса, чтобы определить, включен или выключен сервер приложений.
Теперь имя группы приложений может меняться в течение всего срока его службы. Гарантируется, что только один поток в приложении инициирует это событие из-за некоторой активности пользователя. Теперь у этого единственного потока есть новое имя группы приложений, которое мне нужно обновить до моего потока состояния.
Моя текущая реализация выглядит следующим образом
Статус Thread Main() Взять ReadLock Прочитать имя группы приложений Снять ReadLock
отправить статус
Поток обновлений Main() Взят блокировку записи Обновить имя группы Снять блокировку записи
Однако из-за большого количества отправляемых обновлений я боюсь, что могу привести к снижению производительности при большой нагрузке. Поэтому я работаю над следующей реализацией, но я не уверен, что это сработает.
Новая предлагаемая реализация
- Поток-отправитель содержит char* ptr, char[1024] primaryData, char[1024]secondaryData.
- При первом запуске приложения имя группы обновляется в primaryData, а ptr указывает на primaryData.
- Всякий раз, когда поток обновления имеет событие обновления, он будет проверять, если (ptr == primaryData) Скопировать новое имя приложения в вторичные данные ptr = вторичные данные else Скопировать новое имя приложения в первичные данные. ptr = первичные данные
- Поток состояния всегда будет использовать данные, указанные ptr, для отправки состояния. Поток состояния в конечном итоге получит обновленный ptr (учитывая когерентность кеша) и начнет передачу новых данных.
Здесь следует учесть несколько моментов. 1. Это нормально, даже если новые данные не будут мгновенно доступны для потока состояния 2. Я не хочу, чтобы программа вылетала из-за неправильного доступа к памяти.
Друзья, подскажите, поможет ли вышеизложенная логика избежать блокировки чтения-записи.