Основы программирования на 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);
}
На этот раз при запуске программы на исполнение результат должен выглядеть примерно так, как показано на рисунке.