Чтение двойного атомарной операции в Linux? - PullRequest
0 голосов
/ 30 июня 2010

Я создаю простой сервер, который хранит несколько переменных по всему миру.Иногда эти переменные обновляются, и в течение этого времени переменные блокируются из других потоков.Каждому клиенту, который обращается к серверу, предоставляется собственный поток, но он не может изменить эти переменные и, по сути, доступен только для чтения.Мой вопрос к Интернету заключается в том, нужно ли мне беспокоиться о том, что а) два потока читают одну и ту же переменную одновременно (не изменяются), или б) процесс записи переменной прерывает процесс чтения.

Я знаю, что в большинстве случаев запись двойного числа не является атомарной операцией, поскольку обычно это более одного регистра, но может ли операция чтения быть прервана?

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

Мое первое предположение состоит в том, что это не имеет ничего общего с Linux как ОС.

Это точно связано с используемым процессором, так как некоторые могут загружать / хранить дважды в памяти за 1 операцию. В серии x86 есть такой код операции для FPU.

Он также может быть связан с компилятором, который может использовать эти возможности ЦП для загрузки / хранения дубликатов за 1 операцию. Не знаю, что делает GCC.

2 голосов
/ 30 июня 2010

[Редактировать] Извинения, я был вне этого, когда я первоначально прочитал этот вопрос и дал неправильный ответ, который любезно указал Джальф.

Я знаю, что в большинстве случаев написание двойная не атомарная операция потому что обычно это больше, чем один зарегистрируйтесь, но можете читать операция будет прервана?

Да. Представьте себе, что вы пытаетесь написать свой собственный плавающий тип двойной точности IEEE, используя две переменные размера WORD. Мы не можем прочитать оба из них атомарно, поскольку они являются двумя различными частями. Кто-то может быть в процессе одновременной модификации, в то время как мы пытаемся читать.

мне нужно беспокоиться о потоки читают одну и ту же переменную в в то же время (не меняется) или б) написание переменной процесса прерывание процесса чтения.

a: нет

b: да

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

0 голосов
/ 30 июня 2010

Если вы читаете только , вам не нужно беспокоиться об атомарности.Если вы читаете и пишете, вам необходимо использовать блокировку мьютекса как в потоке «сервер», так и в «клиенте».Блокировка только тогда, когда запись выполняет только половину работы.

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

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