Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/88: Рейтинг темы: голосов - 88, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 06.01.2013
Сообщений: 23
06.01.2013, 19:51
Студворк — интернет-сервис помощи студентам
Хочу разобраться в работе volatile и для чего он нужен...

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

http://msdn.microsoft.com/ru-r... ttww7.aspx
подскажите пожалуйста где я ошибаюсь:

C
1
2
3
4
5
6
7
8
int main ()
{ 
    volatile int b = time(NULL);
    cout << b << " -- ";
    sleep(10);
    cout << b;
    return 0;
}
Насколько я понял, теперь при вызове переменой b, должен заново запрашивать time(NULL), но почему оно показывает два одинаковых чисила, ведь через 10 секунд b имеет уже другое значение?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2013, 19:51
Ответы с готовыми решениями:

И снова volatile. Глобальный массив, изменяемый в обработчике прерывания, должен быть volatile?
Всем привет. Имеется официальный код примера на чип-трансивер nrf24LE1 от Nordic. Keil C51 // Global variables uint8_t...

const volatile
Пример из Шилдт Г. &quot;С++ Базовый курс (3-е издание, 2010)&quot; стр 205 const volatile unsigned char *port = (const volatile char *)...

const_cast: const и volatile
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и volatile. Как мне стало известно volatile -...

29
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
06.01.2013, 20:54
Суть volatile не в этом. Это указание компилятору, что при каждом обращении к переменной нужно заново считываеть ее значение из памяти. Например
C++
1
2
3
4
volatile int c = 10;
std::cout << c << std::endl;
sleep(10);
std::cout << c << std::endl;
если из этого кода убрать слово volatile, то он будет выполнятся так:
1. прочитать значение c
2. передать значение c на печать
3. поспать 10 секунд
4. передать значение c на печать

а с volatile это будет так

1. прочитать значение c
2. передать значение c на печать
3. поспать 10 секунд
4. прочитать значение c
5. передать значение c на печать

т.е. компилятор понимает, что во время выполнение sleep() значение c могло измениться и его нужно получить по новой.
2
0 / 0 / 0
Регистрация: 06.01.2013
Сообщений: 23
06.01.2013, 21:01
ага, тоесть этот момент: int b = time(NULL) оно заново не делает...
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
06.01.2013, 21:55
Нет, просто заново считывается полученое ранее значение.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
07.01.2013, 08:47  [ТС]
Цитата Сообщение от aaleksey Посмотреть сообщение
Ключевое слово volatile указывает, что поле может быть изменено несколькими потоками ...
Там же речь шла про C# (это совсем другой язык)

Инициализация статического массива
Пример использования спецификатора volatile
0
0 / 0 / 0
Регистрация: 06.01.2013
Сообщений: 23
07.01.2013, 15:11
о! я какрас и читаю єту книгу Шилдта, вот с этим временем я и завелся.....
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
17.07.2019, 14:58
Цитата Сообщение от Evg Посмотреть сообщение
Внимание вопрос.
Что по ваему мнению означает переменная, описанная как
extern volatile const int iii;
Что значение переменной iii,
компилятор должен каждый раз честно вычитывать из памяти?

Что происходит в этом коде?

Можете объяснить суть проблем? (Их там две)

https://rextester.com/NRX37053

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template<class t>
t cast(const void* const data) noexcept
{
    return (t)data;
}
 
int main()
{
    int v = 10;
    
    const void* const vv = &v;
    
    volatile int *volatile const & r
        = (volatile int *volatile const &)vv;
    (void)r;
    
    volatile int *volatile const & r2 
        = cast<volatile int *volatile const &>(&v);
    (void)r2;
}
предупреждения компилятора:
Code
1
2
3
4
5
6
7
8
9
10
11
source_file.cpp:17:11: warning: conversion to void will not access object of type ‘volatile int* const volatile’
     (void)r;
           ^
source_file.cpp:21:11: warning: conversion to void will not access object of type ‘volatile int* const volatile’
     (void)r2;
           ^
source_file.cpp: In instantiation of ‘t cast(const void*) [with t = volatile int* const volatile&]’:
source_file.cpp:20:50:   required from here
source_file.cpp:4:26: warning: reference to local variable ‘data’ returned [-Wreturn-local-addr]
 t cast(const void* const data) noexcept
                          ^
С локальной переменной понятно:
локальная переменная-аргумент data завершится сразу как завершится функция,
и ссылка r2 станет невалидной.
Но так как она будет указывать на переменную v,
то значение такой ссылки получается консистентным.

Если бы не предупреждение компилятора,
этот баг бы ещё не скоро нашли.


Что означает ?
Code
1
warning: conversion to void will not access object of type ‘volatile int* const volatile’
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
17.07.2019, 16:19  [ТС]
Строго говоря, тсвой вопрос к изначальной постановке вопроса отношения не имеет. Вопрос касается только volatile'а и особенностей работы с ним на C++

Пример сократил, чтобы убрать лишнюю шелуху, которая может вводить в заблуждение. Например, const тут не при чём, указатели не при чём, да и большинство из имеющихся в наличии volatile'ов тоже не при чём. Я не специалист в Си++. Я знаю, что такое ссылка и как она реализуется в виде кода, но не знаю всяких тонкостей стандарта, с ней связанных. Поэтому здесь в общем-то высказываю свои соображения, но НЕ позиционирую их как истину, вытекающую из стандарта

C
int volatile vv;
 
int main()
{
  int volatile &r = vv;
  (void)r;
}
Переменная "vv" является volatile. Т.е. компилятор не имеет права удалять обращения к ней. Даже если бы в коде было написано "(void)vv;", то компилятор обязан построить операцию чтения из памяти. Теперь мы завели ссылку "r", которая тоже как бы volatile и как бы ассоциирована с volatile-переменной "vv". Однако для кода "(void)r", который по смыслу как бы эквивалентен "(void)vv", компилятор не построил никакого обращения к переменной "vv", т.е. построил, но оптимизации его удалили (но не суть)

Code
$ g++-7.3.0 t.cc -O3 -S
t.cc: In function 'int main()':
t.cc:6:9: warning: conversion to void will not access object of type 'volatile int'
   (void)r;
         ^
 
$ cat t.s
...
main:
        xorl    %eax, %eax
        ret
...
Думаю, предупреждение касается именно этого. Т.е. компилятор сообщает программисту о том, что несмотря на наличии volatile, операция чтения произведена не будет. Т.е. действия компилятора не совпадают с предполагаемым ожиданием программиста
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
17.07.2019, 19:00
Цитата Сообщение от Evg Посмотреть сообщение
Однако для кода "(void)r", который по смыслу как бы эквивалентен "(void)vv", компилятор не построил никакого обращения к переменной "vv", т.е. построил, но оптимизации его удалили (но не суть)
Тут поведение GCC противоречит стандарту.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.07.2019, 17:30
Цитата Сообщение от Evg Посмотреть сообщение
Думаю, предупреждение касается именно этого. Т.е. компилятор сообщает программисту о том, что несмотря на наличии volatile, операция чтения произведена не будет. Т.е. действия компилятора не совпадают с предполагаемым ожиданием программиста
Большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2019, 17:30

Заменить volatile на Thread.MemoryBarrier. Код приведён. Как оптимизировать обращения для чтения к volatile полю класса?
Не совсем понятна мне пока что работа Thread.MemoryBarrier. Знаю, что можно оптимизировать обращения к полю _cancellation, смотрел...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

int\ volatile int \ const int
Товарищи, паника! Имеется код: int a = 5; std::cout &lt;&lt; &quot;Init value a: &quot; &lt;&lt; a &lt;&lt; &quot;\n&quot;; int *p; p = (int*) &amp;a; *p = 0; ...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const;
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru