Обратите внимание, что в delphi вы можете сделать все, что угодно, небезопасным. В то время как другие упоминают о проблемах выравнивания на логическом, это каким-то образом скрывает реальную проблему.
Да, вы можете читать логическое значение в любом потоке и записывать логическое значение в любом потоке, если он правильно выровнен. Но чтение из логического значения, которое вы изменяете, не обязательно «потокобезопасно» в любом случае. Скажем, у вас есть логическое значение, которое вы установили в true, когда вы обновили число, чтобы другой поток считал число.
if NumberUpdated then
begin
LocalNumber = TheNumber;
end;
Из-за оптимизаций, которые процессор делает, TheNumber может быть прочитан до чтения NumberUpdated, таким образом, вы можете получить старое значение события TheNumber, хотя вы обновляли NumberUpdated последним.
Ака, ваш код может стать:
temp = TheNumber;
if NumberUpdated the
begin
LocalNumber = temp;
end;
Имхо, основное правило:
«Чтения являются поточно-ориентированными. Пишут не поточнобезопасными.»
Поэтому, если вы собираетесь защищать данные от записи с синхронизацией везде , вы читаете значение, тогда как запись может потенциально .
С другой стороны, если вы читаете и записываете значение только в одном потоке, то это безопасно для потока. Таким образом, вы можете выполнить большую часть записи во временном местоположении, а затем синхронизировать обновление данных всего приложения.
Бонусная реклама:
VCL не является потокобезопасным. Храните все модификации пользовательского интерфейса в основной ветке. Сохраняйте создание всего пользовательского интерфейса в основной ветке.
Многие функции также не являются поточно-ориентированными, в то время как другие функции часто зависят от базовых вызовов winapi.
Я не думаю, что "список" был бы полезен, поскольку "потокобезопасность" может означать много вещей.