Форум программистов, компьютерный форум CyberForum.ru

Что такое "volatile int" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
zewer
 Аватар для zewer
1018 / 709 / 71
Регистрация: 07.01.2011
Сообщений: 5,346
22.05.2013, 00:51     Что такое "volatile int" #1
есть объявление и инициализация переменной:
C++
1
volatile int Sklad = 0;
что такое "volatile"?
с msdn не очень понял, кто сможет объяснить? с меня "спасибо"!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
22.05.2013, 00:57     Что такое "volatile int" #2
клац
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
22.05.2013, 11:20     Что такое "volatile int" #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ключевое слово volatile может иметь немного разный смысл на разных компиляторах и архитектурах.

В Visual C++ оно имеет следующие свойства:

1) Уберегает volatile-переменную от агрессивной оптимизации компилятора.
Например, в результате оптимизации компилятор мог бы поместить переменную в
регистр, и тогда ее изменения были бы не видны другим потокам (т.к. у каждого
потока свой набор регистров). volatile защищает от этого, заставляя компилятор
каждый раз при обращении к volatile-переменной генерировать чтение и запись в
соответствующую ячейку памяти, даже если это явно невыгодно и связано с
потерей эффективности. Это называется видимость (visiblilty). Форсирование
чтения и запись в память при обращении к volatile-объекту чрезвычайно важно
для одного из пунктов ниже.

2) Ставит барьер компилятора (compiler barrier).
Компилятор не переупорядочивает обращения к volatile-переменным.
В результате, если мы пишем "int volatile a = 100; int volatile b = 200;",
то можем быть уверенными, что в сгенерированном коде запись в "a"
гарантированно будет находиться до записи в "b". Аналогичного эффекта
можно достичь, применяя специальные макросы - _ReadBarrier, _WriteBarrier и
_ReadWriteBarrier. Подчеркну, что это лишь компиляторный барьер, на
уровне CPU все равно возможно переупорядочивание (см. ниже).

3) Чтение и запись в volatile-переменную ставит неполный барьер памяти на
архитектурах IA-32 и AMD64 (acquire and release semantics). Это, так сказать,
небольшой, но приятный побочный эффект volatile, благодаря которому в некоторых
случаях можно обойтись без установки явных барьеров памяти - mfence, xchg и т.п.
Барьеры памяти, если кто не в курсе, нужны, чтобы гарантировать порядок доступа к
памяти на уровне CPU. Например, на упомянутых архитектурах последовательность
операций write-read может быть выполнена, как read-write, и код, который от этого
порядка зависит, может поломаться. Если интересует, могу дать несколько ссылок.

4) Вопреки распостраненному мнению, volatile не обеспечивает атомарности, он
связан лишь с видимостью.
Например, на 32-битных архитектурах доступ к 64-битной переменной не атомарен, и
volatile здесь не помощник.
Иллюстрация:
C++
1
2
3
4
5
6
7
8
9
#include <Windows.h>
 
__int64 volatile g_Value;
 
int main()
{
    g_Value = 0xAAAABBBBCCCCDDDD;
    return 0;
}
Сгенерированный ассемблерный код:
_main PROC

; 11 : g_Value = 0xAAAABBBBCCCCDDDD;

mov DWORD PTR ?g_Value@@3_JC, -858989091 ; ccccddddH
mov DWORD PTR ?g_Value@@3_JC+4, -1431651397 ; aaaabbbbH

; 12 : return 0;

xor eax, eax

; 13 : }

ret 0
_main ENDP
_TEXT ENDS
END
Между двумя mov запросто может кто-нибудь вклиниться.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.05.2013, 11:41     Что такое "volatile int" #4
Убежденный, а можно вышеупомянутую ссылочку?
Jupiter
22.05.2013, 11:59
  #5

Не по теме:

не помешает

там же и про volatile

Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 982
Регистрация: 02.05.2013
Сообщений: 10,298
Завершенные тесты: 1
22.05.2013, 12:14     Что такое "volatile int" #6
Intel 64 and IA-32 Architectures Software Developer's Manual
http://www.intel.com/content/www/us/...r-manuals.html
Том 3, Глава 8.2, "Memory Ordering".
Также ищите по ключевым словам "Store Buffers".

AMD64 Architecture Programmer's Manual
http://developer.amd.com/resources/d...uides-manuals/
Volume 1, Глава 3.9, "Memory Optimization".

Статья в MSDN о volatile:
http://msdn.microsoft.com/en-us/libr...v=vs.100).aspx
Обратите внимание на абзац с описанием acquire и release semantics.

Документ MSDN о проблемах многопоточности:
Multiprocessor Considerations for Kernel-Mode Drivers
http://msdn.microsoft.com/en-us/libr.../gg487433.aspx
Пусть слово "Drivers" не смущает, смотрите главу "Memory Barriers and
Hardware Reordering".

Статья в блоге Kang Su о volatile:
volatile, acquire/release, memory fences, and VC2005
http://blogs.msdn.com/b/kangsu/archi...nd-vc2005.aspx

Неплохой обзорный документ о барьерах памяти:
Things You Never Wanted to Know about Memory Fences
http://nwcpp.org/static/talks/2008/Memory_Fences.pdf

Еще один документ от Intel:
A Taxonomy of Multiprocessor Memory-Ordering Models
http://www.cs.utah.edu/mpv/papers/neiger/fmcad2001.pdf

Статья в Linux Journal:
Memory Ordering in Modern Microprocessors
http://www.linuxjournal.com/article/8211
Внимание!
Таблица правил переупорядочивания для разных процессоров (стр.2) некорректна.

Очень хороший сайт по проблемам многопоточности и lock-free, в том
числе рассматривается и вопросы memory ordering:
1024cores
http://www.1024cores.net/
Кстати, автор сайта (Д.Вьюков) написал целый ряд статей по многопоточному
программированию, ему же принадлежит инструмент для детекта ошибок в
многопоточных алгоритмов (Relacy Race Detector).

К сожалению, правила данного форума запрещают публиковать ссылки на
другие форумы, иначе список был бы несколько полнее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 21:24     Что такое "volatile int"
Еще ссылки по теме:

невозможно преобразовать параметр 1 из "int" в "int *&" C++
Ошибка "error C2446: :: нет преобразования "int" в "char *" C++
ошибка: несовместимые типы операндов ("int *" и "int") C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
26.01.2014, 21:24     Что такое "volatile int" #7
Цитата Сообщение от Убежденный Посмотреть сообщение
... (т.к. у каждого потока свой набор регистров) ...
Мм.. Разве?

Добавлено через 9 минут
Всё верно. Неправильно понял, и забыл что делает TSS ..
Yandex
Объявления
26.01.2014, 21:24     Что такое "volatile int"
Ответ Создать тему
Опции темы

Текущее время: 03:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru