Tytu³: Volatile - opis miennej w C++ Wiadomo¶æ wys³ana przez: admin Marzec 24, 2012, 10:05:37 S³ówko volatile oznacza jednoznacznie ulotny. Warto¶æ zmiennej te¿ nie zmieni siê dopóki sami tego nie uczynimy. Pewne zmienne mog± zostaæ zmodyfikowane bez naszaj woli, wiêcej mog± zostaæ zmienione bez naszej wiedzy. S± czasem pewne specyficzne sytuacje, kiedy warto¶æ zmiennej mo¿e ulec zmianie bez inicjatywy z naszej strony. Proszê wyobraziæ sobie tak± sytuacjê, piszemy program dla sterownika steruj±cego ilo¶ci± przep³ywaj±cego powietrza w silniku spalinowym. Przep³yw powietrza zmienia siê co kilkadziesi±t milisekund. Program powinien odczytywaæ warto¶æ przep³ywu co te kilkana¶cie milisekund inaczej mo¿e pojawiæ siê b³±d pomiarowy. Aby siê przed tym ustrzec stosuje siê w³a¶nie modyfikator volatile. Informuje on kompilator, ¿e dana zmienna zawiera ulotn± warto¶æ i na wszelki wypadek nale¿y j± kontrolowaæ czê¶ciej. Oczywi¶cie ten modyfikator jest zbêdny w programach pisanych na co dzieñ. W takich programach zmienne nie mog± siê zmieniaæ od tak sobie. Ten modyfikator jest natomiast przydatny je¶li opracowaæ oprogramowanie urz±dzeñ zewnêtrznych. volatile int adam; Zmienna zdefiniowana w taki sposób bêdzie bacznie kontrolowana przez procesor. Tytu³: Odp: Volatile - opis miennej w C++ Wiadomo¶æ wys³ana przez: admin Marzec 24, 2012, 10:27:08 Przyk³ad programu wykorzystuj±cego zmienn± typu voltaire
#include <cstdlib> #include <iostream> #include <iostream> #include <windows.h> using namespace std; volatile bool pilnuj = true; int Dane = 0; unsigned ThreadFunc1( void* pArguments ) { while (pilnuj) Sleep(0); cout << "Dana = " << Dane << endl; return 0; } unsigned ThreadFunc2( void* pArguments ) { Sleep(2000); Dane++; pilnuj = false; return 0; } int main() { HANDLE hThread1, hThread2; DWORD retCode; hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc1, NULL, 0, NULL); hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc2, NULL, 0, NULL); if (hThread1 == NULL || hThread2 == NULL) { if (hThread1 != NULL) CloseHandle(hThread1); if (hThread2 != NULL) CloseHandle(hThread2); cout << "Do bani to pilnowanie." << endl; return 1; } system("PAUSE"); return EXIT_SUCCESS; } |