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

Вы можете включить журналы отладки SSL в конфигурации JVM сервера приложений, добавив следующий параметр командной строки JVM и перезапустив сервер приложений:

-Djavax.net.debug = all

В зависимости в вашей версии WAS добавление вышеуказанного параметра обычно выполняется путем перехода к консоли администратора WAS> Серверы> Серверы приложений> YourServer> Управление процессами> Виртуальная машина Java> Общие аргументы JVM

9
задан Daniel Dickison 13 May 2009 в 18:44
поделиться

7 ответов

Разные архитектуры имеют разные правила, но в целом загрузка памяти и сохранение выровненных, int -размерных объектов являются атомарными. Меньшие и большие могут быть проблематичными. Так что если sizeof (float) == sizeof (int) , вы можете быть в безопасности, но я все равно не буду зависеть от него в переносимой программе.

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

Короче говоря. , даже если загрузка и сохранение являются атомарными на float x , я бы использовал явные барьеры памяти (хотя их размер зависит от платформы и компилятора) вместо зависимости от volatile .

13
ответ дан 4 December 2019 в 08:34
поделиться

Согласно разделу 24.4.7. 2 документации библиотеки GNU C:

На практике вы можете предположить, что int и другие целочисленные типы, длина которых не превышает int , являются атомарными. Вы также можете предположить, что типы указателей являются атомарными; это очень удобно. Оба эти предположения верны на всех машинах, которые поддерживает библиотека GNU C, и на всех известных нам системах POSIX.

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

Самый безопасный способ действий - использовать какую-либо форму мьютекса для защиты доступа к общей переменной.

5
ответ дан 4 December 2019 в 08:34
поделиться

I would lock it down. I'm not sure how large float is in your environment, but it might not be read/written in a single instruction so your reader could potentially read a half-written value. Remember that volatile doesn't say anything about atomicity of operations, it simply states that the read will come from memory instead of being cached in a register or something like that.

3
ответ дан 4 December 2019 в 08:34
поделиться

Я считаю, что вам следует использовать мьютекс. Когда-нибудь ваш код может работать в системе, которая не имеет реального оборудования с плавающей запятой и вместо этого использует эмуляцию, что приводит к неатомарным переменным с плавающей запятой. Например, посмотрите -msoft-float здесь .

Мой ответ не был очень полезным. gcc -msoft-float , возможно, является просто частным случаем, когда загрузка и хранение чисел с плавающей запятой не являются атомарными.

1
ответ дан 4 December 2019 в 08:34
поделиться

Присваивание не является атомарным, по крайней мере для некоторых компиляторов, и в том смысле, что для его выполнения требуется одна инструкция. Следующий код был сгенерирован Visual C ++ 6.0 - f1 и f2 относятся к типу float:

4:        f2 =  f1;
00401036   mov         eax,dword ptr [ebp-4]
00401039   mov         dword ptr [ebp-8],eax
3
ответ дан 4 December 2019 в 08:34
поделиться

Так как вы изменяете одно слово в памяти, вам должно быть хорошо с объявлением volatile.

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

0
ответ дан 4 December 2019 в 08:34
поделиться

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

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

На самом деле, я думаю, два вопроса: «В чем обратная сторона наличия здесь мьютекса?» и «Каковы будут последствия, если я получу чтение мусора?»

Возможно, вместо мьютекса вам следует написать утверждение, которое определяет, меньше ли размер хранилища плавающего объекта или равен размеру слова базового процессора.

0
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

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