Re: Реальный пример использования volatile
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 18.01.05 09:48
Оценка:
Здравствуйте, What, Вы писали:

Но ведь здесь не используются примитивы синхронизации! С моей точки зрения, это как раз опасная практика -- изменять значение в одном потоке без блокирования чтения из другого потока.

Если бы вы использовали синхронизацию доступа к go, то volatile, наверняка, не потребовался бы.

W>Достаточно часто реально используется следующая схема.

W>Есть рабочий поток, который в цикле выполняет интенсивные вычисления. Рабочий поток периодически опрашивает состояние глобальной переменной и, если всё ок, продолжает работать, иначе останавливается. Если пользователь решил отменить действие, GUI-поток меняет значение этой переменной.
W>
W>#include <iostream>
W>#include <process.h>
W>#include <windows.h>

W>/*volatile*/ bool go = true;
W>const unsigned int MaxIter = 1000000000;

W>// Эта процедура выполняет интенсивный вычисления.
W>unsigned int __stdcall Calc(void *)
W>{
W>    double sum = 0.0;
W>    for (unsigned int i = MaxIter; (i != 0) && go; --i)
W>        sum += 1. / i;
W>    std::cout << "sum = " << sum << std::endl;
W>    return 0;
W>};

W>int main()
W>{
W>    unsigned int id;
W>    HANDLE h = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0,  &Calc, NULL, 0, &id));
W>    // Пользователь подумал 20 миллисекунд
W>    ::Sleep(20);
W>    // .. и решил отменить вычисления
W>    go = false;
W>    ::WaitForSingleObject(h, INFINITE);
W>    ::CloseHandle(h);
W>    return 0;
W>}
W>


W>Так вот, когда volatile закомментирован, то рабочий поток не останавливается программа выводит:

W>

W>21.3005


W>А когда volatile есть, поток останавливается и программа выводит:

W>

W>0.00287083


W>Компилятор VC 7.1. Командная строка:

W>
W>/O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /EHsc
W>/MD /GS /Fo"Release/" /Fd"Release/vc70.pdb" /W3 /nologo /c /Wp64 /Zi /TP
W>
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.