Создание больших приложений подразумевает, что к одним и тем же данным будут производиться множественные обращения и как результат может появиться ситуация, при которой время обращения существенно влияет на результат. Чтобы это было более понятно давайте рассмотрим простой пример. У нас есть объект бухгалтерского счета. Смотрите код.
// PotocTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include "iostream.h" class Cchet10 { public: Cchet10(); void Set(double summ); double Get(); private: double count; }; Cchet10::Cchet10() { count=0; } void Cchet10::Set(double summ) { count=summ; } double Cchet10::Get() { return count; } void main() { Cchet10 ch; ch.Set(ch.Get()+123); cout << ch.Get() << endl; }
Вот у нас есть объект счета 10, и метод set, который устанавливает новое значение счета. При однопотоковой работе в одном приложении все нормально. Но вот только нам нужно несколько потоков. Если вдруг к этому объекту начнет обращаться насколько пользователей все станет хуже. Давайте cэмитируем многопотоковый доступ.
// PotocTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include "process.h" #include "iostream.h" #include "stddef.h" #include "stdlib.h" class Cchet10 { public: Cchet10(); void Set(double summ); double Get(); private: double count; }; Cchet10::Cchet10() { count=0; } void Cchet10::Set(double summ) { count=summ; } double Cchet10::Get() { return count; } Cchet10 ch; void set1(void *); void set2(void *); void main() { ch.Set(20); if (_beginthread(set1,1024,NULL)==-1) cout << "Error begin thread " << endl; if (_beginthread(set2,1024,NULL)==-1) cout << "Error begin thread " << endl; Sleep(10000); cout << ch.Get() << endl; } void set1(void *) { Sleep(1000); cout << "set1" << endl; ch.Set(10); _endthread(); } void set2(void *) { cout << "set2" << endl; ch.Set(ch.Get()+2000); _endthread(); }
Не забудьте при компиляции установить опцию многопотокового приложения.
Так вот результат выполнени этой программы будет такой:
set2 set1 10 Press any key to continue
Посмотрите на код, я в конце main даже Sleep поставил, чтобы приложение не завершилось раньше потока. По какой причине задержка set1 - только для демонстрации. Это может оператор пошел чай попить или еще что-то. Конечно пока все это происходит в рамках одной программы это немного натянуто, но если представить два потока как два пользователя, то все становится намного реальнее. А основная проблема в том, что данные у нас разделяемые и к ним может быть многочисленный доступ.