Основы программирования на Win32
Потоки и семафоры
Для иллюстрации того, как создаются потоки и как они синхронизируются, используя программный интерфейс API WIN32, создадим приложение на C++, использующее системный вызов для создания потока внутри процесса.
Создайте новый проект типа Win32 Empty Project с именем, например Semaphore, и поместите в него файл semaph.cpp, содержащий следующий программный код:
#include <windows.h> #include <stdio.h> #include <math.h> int Sum = 0, iNumber=5, jNumber=300000; HANDLE hFirstSemaphore, hSecondSemaphore; DWORD WINAPI SecondThread(LPVOID) { int i,j; double a,b=1.; for (i = 0; i < iNumber; i++) { WaitForSingleObject(hSecondSemaphore, INFINITE); for (j = 0; j < jNumber; j++) { Sum = Sum + 1; a=sin(b); } printf("second %d \n",Sum); ReleaseSemaphore(hFirstSemaphore, 1, NULL); } return 0; } void main() { int i,j; HANDLE hThread; DWORD IDThread; double a,b=1.; hFirstSemaphore = CreateSemaphore(NULL, 0, 1, "MyFirstSemaphore"); hSecondSemaphore = CreateSemaphore(NULL, 1, 1, "MySecondSemaphore1"); hThread=CreateThread(NULL, 0, SecondThread, NULL, 0, &IDThread); if (hThread == NULL) return; for (i = 0; i < iNumber; i++) { WaitForSingleObject(hFirstSemaphore, INFINITE); for (j = 0; j < jNumber; j++) { Sum = Sum - 1; a=sin(b); } printf("first %d \n",Sum); ReleaseSemaphore(hSecondSemaphore, 1, NULL); } WaitForSingleObject(hThread, INFINITE); // ожидание окончания потока SecondThread CloseHandle(hFirstSemaphore); CloseHandle(hSecondSemaphore); printf("last %d \n",Sum); return; }
Если программа составлена без ошибок, то при ее запуске результат должен выглядеть примерно так, как показано на рисунке.
В этом же решении создайте еще один проект с именем, например nosynch. Для этого в окне Solution Explorer щелкните правой кнопкой мыши на самом верхнем пункте Solution 'Semaphore' и в появившемся контекстном меню выберите пункты Add - New Project. Во второй проект добавьте файл nosynch.cpp с кодом:
#include <windows.h> #include <stdio.h> #include <math.h> int Sum = 0, iNumber=5, jNumber=30000000; DWORD WINAPI SecondThread(LPVOID){ int i,j; double a,b=1.; for (i = 0; i < iNumber; i++) { for (j = 0; j < jNumber; j++) { Sum = Sum + 1; a=sin(b); } printf("second %d \n",Sum); } return 0; } void main(){ int i,j; double a,b=1.; HANDLE hThread; DWORD IDThread; hThread=CreateThread(NULL, 0, SecondThread, NULL, 0, &IDThread); if (hThread == NULL) return; for (i = 0; i < iNumber; i++) { for (j = 0; j < jNumber; j++) { Sum = Sum - 1; a=sin(b); } printf("first %d \n",Sum); } WaitForSingleObject(hThread, INFINITE); // ожидание окончания потока SecondThread printf("last %d \n",Sum); }
На этот раз при запуске программы на исполнение результат должен выглядеть примерно так, как показано на рисунке.