Список типов данных Delphi с 'ориентированными на многопотоковое исполнение' операциями чтения-записи?

Использование pd.DataFrame.isnull с pd.Series.items :

df = pd.DataFrame({'a': [1, np.nan, 2, np.nan],
                   'b': [1, 5, 6, 6]})

res = list(df.isnull().sum().items())
# [('a', 2), ('b', 0)]

10
задан Shannon Matthews 22 August 2017 в 23:45
поделиться

4 ответа

Обратите внимание на то, что можно сделать по существу все в Дельфи неориентированным на многопотоковое исполнение. В то время как другие упоминают проблемы выравнивания на булевской переменной, это способом скрывает настоящую проблему.

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

if NumberUpdated then
begin
  LocalNumber = TheNumber;
end;

Из-за оптимизации процессор делает TheNumber, может быть считан, прежде чем NumberUpdated читается, таким образом можно получить старое значение TheNumber eventhough, Вы обновили NumberUpdated в последний раз.

Иначе, Ваш код может стать:

temp = TheNumber;
if NumberUpdated the
begin
  LocalNumber = temp;
end;

По моему скромному мнению, основное эмпирическое правило:
"Чтения ориентированы на многопотоковое исполнение. Записи не ориентированы на многопотоковое исполнение".
Таким образом, если Вы собираетесь сделать защиту от записи данные с синхронизацией везде, Вы читаете значение, в то время как запись могла потенциально произойти.
С другой стороны, если Вы только читаете и пишете значение в одном потоке, затем это ориентировано на многопотоковое исполнение. Таким образом, можно сделать большой блок записи во временном месте, затем синхронизировать обновление applicationwide данных.

Бонусная аннотация:

VCL не ориентирован на многопотоковое исполнение. Сохраните всю модификацию материала ui в основном потоке. Сохраните создание всего материала ui в основном потоке также.

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

Я не думаю, что "список" был бы полезен, поскольку "ориентированный на многопотоковое исполнение" может означать много материала.

9
ответ дан 3 December 2019 в 16:31
поделиться

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

Существует много функций, которые допускают атомарные операции: взаимно блокируемый инкремент, взаимно блокируемый декремент, и взаимно блокировали обмен. Это - общее понятие, ничто характерное для Windows, x86 или Delphi. Для Delphi можно использовать InterlockedFoo () функции Windows API, существует несколько оберток вокруг тех также. Или запишите свое собственное. Функции воздействуют на целые числа, таким образом, у Вас могут быть атомарный инкремент, декремент и обмен целыми числами (32 бита) с ними.

Можно также использовать ассемблер и операцию в секунду префикса с префиксом блокировки.

Для получения дополнительной информации см. также этот вопрос о StackOverflow.

7
ответ дан 3 December 2019 в 16:31
поделиться

Код Инди содержит некоторых атомарных / ориентированные на многопотоковое исполнение типы данных в IdThreadSafe.pas:

  • TIdThreadSafeInteger
  • TIdThreadSafeBoolean
  • TIdThreadSafeString
  • TIdThreadSafeStringList и еще немного...
1
ответ дан 3 December 2019 в 16:31
поделиться

На 32-разрядной архитектуре, только правильно выровненной 32-разрядный или меньше типов данных, должен считаться атомарным. 32-разрядные значения должны быть 4 выровнены (адрес данных должен быть равномерно делимым четыре). Вы, вероятно, не столкнулись бы с чередованием на таком трудном уровне, но теоретически Вы могли иметь дважды, Int64 или Расширенная неатомарная запись.

5
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

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