Основы программирования на 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);	
 }

На этот раз при запуске программы на исполнение результат должен выглядеть примерно так, как показано на рисунке.

Hosted by uCoz