Я должен защитить доступ для чтения к контейнеру STL в среде многопоточности?

Я нашел проблему. Это должно произойти, когда построен StreamBuilder на странице настроек, он только слушает предстоящие данные, а не предыдущие данные. Для того, чтобы получить предыдущие данные, нам нужно сделать несколько вещей.

В Bloc использует пакет BehaviorSubject из rxdart вместо streamController и определяет ValueObservable вместо Stream

  StreamController _selectedCurrencies = BehaviorSubject();
  ValueObservable get getSelectedCurrencies => _selectedCurrencies.stream;
  StreamSink get modifySelectedCurrencies => _selectedCurrencies.sink;

Затем на странице настроек предоставьте streamBuilder начальные данные

[111 ]

Это работает:)

8
задан davidag 28 October 2008 в 16:04
поделиться

8 ответов

Да, потокам чтения будет нужно своего рода взаимоисключающее управление, иначе запись изменит вещи из-под него.

Взаимное исключение читателя/устройства записи должно быть достаточно. Но строго говоря это - implmentation-конкретный-вопрос. Возможно, что реализация может иметь изменяемых участников даже в объектах константы, которые только для чтения в Вашем коде.

10
ответ дан 5 December 2019 в 12:14
поделиться

Я не полагаю, что контейнеры STL ориентированы на многопотоковое исполнение, поскольку нет хорошего способа обработать межплатформенные потоки. Вызов к размеру () прост, но он все еще должен быть защищен.

Это походит на великолепное место для использования блокировок чтения-записи.

1
ответ дан 5 December 2019 в 12:14
поделиться

Необходимо полагать, что некоторая реализация SLT могла бы вычислить размер при вызове.
Для преодоления этого Вы могли определить новую переменную

volatile unsigned int ContainerSize = 0;

Уже обновите переменную только внутри защищенные вызовы обновления, но можно читать / тестируют переменную без защиты (принимающий во внимание, что Вам не нужно точное значение).

1
ответ дан 5 December 2019 в 12:14
поделиться

Контроль параллельные контейнеры, обеспеченные библиотекой Open Source Threading Building Blocks Intel. Посмотрите под "Контейнерными Отрывками" на странице Code Samples для некоторых примеров. Они имеют параллельный / ориентированные на многопотоковое исполнение контейнеры для векторов, хешируют карты и очереди.

2
ответ дан 5 December 2019 в 12:14
поделиться

Да. Я предложил бы перенести Вашу библиотеку STL с классом, который осуществляет последовательный доступ. Или найдите подобный класс, это было уже отлажено.

0
ответ дан 5 December 2019 в 12:14
поделиться

Я собираюсь сказать "нет". В этом случае.

Без взаимного исключения, что Вы могли бы найти, то, что размер () иногда возвращает неправильное значение, поскольку объекты добавлены или удалены. Если это приемлемо для Вас, пойдите для него.

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

PS. Размер VC6 () просто возвращает _Size внутреннего участника, не имение взаимного исключения не будет проблемой с Вашей конкретной реализацией, за исключением того, что это могло бы возвратиться 1, когда второй элемент добавляется, или наоборот.

PPS. кто-то упомянул блокировку RW, это - хорошая вещь, особенно если Вы испытываете желание получить доступ к объектам списка позже. Измените свое взаимное исключение на Повышение:: shared_mutex был бы выгоден затем. Однако никакое взаимное исключение вообще не необходимо, если все, что Вы называете, является размером ().

0
ответ дан 5 December 2019 в 12:14
поделиться

STL в VC ++ версия 6 не ориентирована на многопотоковое исполнение, посмотрите этот недавний вопрос. Таким образом, кажется, что Ваш вопрос немного не важен. Даже если Вы сделали все правильно, у Вас могут все еще быть проблемы.

0
ответ дан 5 December 2019 в 12:14
поделиться

Безопасен ли размер () (для определения "безопасных", которые Вы обеспечиваете), является зависящим от реализации. Даже если Вы застрахованы на Вашей платформе для Вашей версии Вашего компилятора на Вашем уровне оптимизации для Вашей версии библиотеки потока и времени выполнения C, не кодируйте этот путь. Это возвратится к байту Вы, и это будет ад для отладки. Вы собираетесь для отказа.

0
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: