Эта тема безопасна? (общие данные без мьютекса / семафора) - PullRequest
1 голос
/ 09 октября 2009

Так что это очень специфический вопрос:

Я использую встроенную систему с одним ядром ЦП.

У меня есть один основной поток и прерывание. Они разделяют 32-разрядное число с плавающей запятой. Прерывание записывает число с плавающей точкой, а основной поток читает его. Чтение и запись не синхронизированы.

В документации процессора указано, что 32-разрядное чтение выполняется за один цикл.

Прав ли я в своей оценке, что нет риска, что основной поток прочитает искаженное значение? Или есть другие факторы?

Ответы [ 5 ]

2 голосов
/ 09 октября 2009

Пока чтение и запись являются атомарными операциями, все должно быть в порядке. Сколько времени занимает чтение или запись, не имеет значения, хотя вполне вероятно, что они атомарные, если они 1 цикл.

1 голос
/ 09 октября 2009

Звучит как будто ты в безопасности. Если чтение выполняется сразу, никто не может записать только половину байтов. Сказав это, вам нужно убедиться, что значение всегда действительно читается вашим потоком, а не оптимизируется компилятором. Это может произойти, если компилятор считает, что никто не может изменить переменную извне. Объявление его как volatile должно помочь (если вообще применимо - я не знаком с вашим кодом).

0 голосов
/ 09 октября 2009

Атомное чтение / запись может быть не единственным соображением, чтобы сделать операции потокобезопасными. Я думаю, что ответ будет зависеть от модели памяти ОС. Вы должны убедиться, что чтение в вашем основном потоке получит последнее значение, записанное прерыванием.

0 голосов
/ 09 октября 2009

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

0 голосов
/ 09 октября 2009

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

В документации также указано, что запись занимает один цикл? Если нет, то вам нужна защита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...