Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
zewer
1333 / 1022 / 109
Регистрация: 07.01.2011
Сообщений: 6,787
#1

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

22.05.2013, 00:51. Просмотров 3445. Ответов 6
Метки нет (Все метки)

есть объявление и инициализация переменной:
C++
1
volatile int Sklad = 0;
что такое "volatile"?
с msdn не очень понял, кто сможет объяснить? с меня "спасибо"!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 00:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое "volatile int" (C++):

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Что делать с ошибкой: C2440: инициализация: невозможно преобразовать "int **" в "int *" - C++
Задание, сделать класс динамического массива шаблонным. Вот, вроде бы сделал, но наткнулся на ошибку, что не так? Код: ...

Что такое "широкие" и "узкие" С-строки - C++
Гуглила, и не нашла более-менее нормального ответа на вопрос: "Что же такое "широкие" и "узкие" С-строки. Если приведете пример - вообще...

Исправить ошибку C2664: fcvt: невозможно преобразовать параметр из "int" в "int *" - C++
ПИшу програму перевод дробового числа с указанием количесв цифр после точки , с инт в чар !!!!Но выбивает ошибку !!! ...

int main () { int a=3,b=2,c; c=a+b; cout << "c=" << c; } Что не правильно? - C++
#include &lt;iostream&gt; using namespace std; int main () { int a=3,b=2,c; c=a+b; cout &lt;&lt; &quot;c=&quot; &lt;&lt; c; }в чем...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

6
ssXXss
266 / 188 / 10
Регистрация: 15.01.2011
Сообщений: 681
22.05.2013, 00:57 #2
клац
2
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.05.2013, 11:20 #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 запросто может кто-нибудь вклиниться.
15
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.05.2013, 11:41 #4
Убежденный, а можно вышеупомянутую ссылочку?
0
Jupiter
22.05.2013, 11:59
  #5

Не по теме:

не помешает

там же и про volatile

1
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.05.2013, 12:14 #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/library/12a04hfd(v=vs.100).aspx
Обратите внимание на абзац с описанием acquire и release semantics.

Документ MSDN о проблемах многопоточности:
Multiprocessor Considerations for Kernel-Mode Drivers
http://msdn.microsoft.com/en-us/library/windows/hardware/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).

К сожалению, правила данного форума запрещают публиковать ссылки на
другие форумы, иначе список был бы несколько полнее.
3
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
26.01.2014, 21:24 #7
Цитата Сообщение от Убежденный Посмотреть сообщение
... (т.к. у каждого потока свой набор регистров) ...
Мм.. Разве?

Добавлено через 9 минут
Всё верно. Неправильно понял, и забыл что делает TSS ..
0
26.01.2014, 21:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 21:24
Привет! Вот еще темы с ответами:

VS2010 разница между "int _tmain()" и "int main()" - C++
в книгах пишут что главная функция int main() а создается int _tmain() причем появляются ошибки если писать int main() понятно что...

МАССИВЫ: динамические мас.значение типа "int *" нельзя присвоить сущности типа "int" - C++
МАССИВЫ: динамические массива ОШИБКА:значение типа &quot;int *&quot; нельзя присвоить сущности типа &quot;int&quot; #include &lt;iostream&gt; using...

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf" - C++
Сделал многофайловую программу программу, вот она: //golf.h #include &lt;iostream&gt; #ifndef golg_h_ #define golf_h_ const int Len =...

невозможно преобразовать параметр 1 из "int" в "int *&" - C++
#include &lt;iostream&gt; using namespace std; void Func1(int *n) { cout &lt;&lt; *n &lt;&lt; &quot; = &quot; &lt;&lt; *n &lt;&lt; endl; } void Func2(int &amp;n) ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru