Изучение средств синхронизации процессов и потоков в ОС Windows: Методические рекомендации по выполнению лабораторной работы, страница 4

    MessageBox(NULL, "Событие произошло!", "Информация",MB_OK);

  }

  else

  {

   cout<<"Set event\n";

   SetEvent(event);

  }

  CloseHandle(event);

}

     Приложение 2.

//Программа ExEv1.cpp

// Тип приложения Win32 Console

// Демонстрация использования события для синхронизации процессов.

// Данная программа ExEv1  после создания исполняемого файла

// запускается командой меню Пуск|Выполнить

   // Она создает событие с именем "Ev1" и затем файл и записывает в него строку

// Выполнив операции с файлом, она выводит диалоговое окно "Сообщение",

// которое не следует закрывать до запуска другой программы ExEv2.cpp

// Программа ExEv2  запускается также из меню Пуск|Выполнить

// см. далее комментарии к программе ExEv2

#include <fcntl.h>

#include <io.h>

#include <windows.h>

#include <stdio.h>

#include <string.h>

int main(void)

{

char *s = "Строка 1.";

HANDLE Event1;

int handle;

// создание события

Event1 = CreateEvent(NULL,FALSE,FALSE, "Ev1");

// операции создания и записи в файл

if ((handle = open("c:\\мои документы\\Myfile1.txt",

                    O_WRONLY | O_CREAT ))==-1)

 {

  MessageBox(NULL, "Файл создать не удалось", "Ошибка", MB_OK);

  return -1;

 }

write(handle, s,  strlen(s)+1);

close(handle);

// Установка события

MessageBox(NULL, "Для установки события нажмите OK", "Сообщение", MB_OK);

SetEvent(Event1);

return 0;

}

// Программа  ExEv2

// Тип приложения Win32 Console

// Программа, связанная с программой  ExEv1 . Программа ExEv2 запускается из

// меню Пуск|Выполнить до закрытия окна "Сообщение".

// Она открывает созданное в ExEv1 событие "Ev1" и с помощью

// функции WaitForSingleObject() проверяет его состояние (сигнальное или не-           // сигнальное)

// После нажатия кнопки "OK" программа  ExEv1 функцией SetEvent()

// устанавливает  событие "Ev1" в сигнальное состояние и после этого

// функция WaitForSingleObject()

// разрешает открытие файла, созданного в программе ExEv1,

// и добавление в него новой строки

// При окончании программа закрывает событие

// Примечание: Если после создания файла программой ExEv1 ему устанавливает-// ся   атрибут "Только для чтения", то до запуска программы ExEv2 следует // снять  этот атрибут

  #include <windows.h>

  #include <fcntl.h>

  #include <stdio.h>

  #include <string.h>

  #include <io.h>

  int main(void)

  {

    char *s1 = "Строка 2.";

    int handle1, res;

    HANDLE h1;

    // Открытие события

    h1=OpenEvent(NULL, FALSE, "Ev1");

    // Проверка состояния мьютекса

    WaitForSingleObject(h1, INFINITE);

    if ((handle1 = open("c:\\мои докумен    ты\\Myfile1.txt",O_WRONLY|O_APPEND))==-1)

  {

     MessageBox(NULL, "Файл открыть не удалось", "Ошибка", MB_OK);

   }

   res = write(handle1, s1, strlen(s1)+1);

   printf("\n Wrote %d symbols", res);

  close(handle1);

   printf("\n Press any key");

   getchar();

   // Закрытие события

   CloseHandle(h1);

   return 0;

  }

Приложение   3

//Программа демонстрации работы мьютекса

     //При запуске программа получает во владение мьютекс

//При повторном запуске программа не может получить мьютекс,

//пока не завершится работа первого экземпляра программы

// Тип приложения Win32, Console

#include <windows.h>

#include <iostream.h>

void main()

{

  HANDLE mutex=CreateMutex(NULL, FALSE, "Mutex");//Создание мъютекса

   cout<<"Test mutex\n";

   cout.flush();

   //Определение состояния мьютекса

   WaitForSingleObject(mutex, INFINITE);

   cout << "\n Mutex obtain!\n";

   cout.flush();

   MessageBox(NULL, "Программа владеет мьютексом", "МЬЮТЕКС", MB_OK);

   //Освобождение мьютекса

   ReleaseMutex(mutex);

   CloseHandle(mutex);

}

Приложение  4

// Программа демонстрации использования семафоров для синхронизации потоков

// Основной поток создает семафор  и устанавливает его в состояние нуль

// ("семафор закрыт").  Этот поток создает файл, записывает в него строку,

// закрывает  файл и до освобождения семафора запускает новый поток,

// который должен открыть файл, прочитать из него строку символов и вывести // её на экран. После запуска нового потока и перевода его в состояние

// ожидания  освобождения семафора основной поток переводит его в сигналь- // ное состояние,

// в результате второй поток получает  возможность выполнить свою работу

// Тип приложения - Win32 Console, Multithread

#include <fcntl.h>

#include <io.h>

#include <windows.h>

#include <stdio.h>

#include <process.h>   

#include <string.h>

char *s = "Hello!";

HANDLE semaphre1;

// функция, исполняемая в созданном потоке

void thread_code(void *threadno)

{

    char s1[5];

    int handle1;

    DWORD a;

// Определение состояния семафора

    a = WaitForSingleObject(semaphore1, INFINITE);

    if (a == WAIT_OBJECT_0)   {   // Если семафор освобожден

// Открытие и чтение файла

    handle1 = open("c:\\мои документы\\Myfile2.txt",O_RDONLY|O_BINARY) ;

    printf("\n File open success!");

    read(handle1, s1,  strlen(s)+1);

   close(handle1);

   printf("\n\n s1==%s",  s1 );

}

 _endthread(); // Окончание работы второго потока

}

// функция создания второго потока

void start_thread(int i)

{

    int thread_id;

#if    defined(__WIN32__)

  if (( thread_id = _beginthread(thread_code,4096,(void *)i)) ==

     (unsigned long)-1)

#else

    if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == -1)

#endif

    {

        printf("Unable to create thread %d, errno = %d\n",i,errno);

        return;

    }

    printf("\n Created thread %d, ID = %ld\n",i,thread_id);

}

int main(void)

{

int i =1;

int handle;

// Создание семафора

semaphore1 = CreateSemaphore(NULL,0,1, "Semr1");

// Создание и запись в файл

if ((handle = open("c:\\мои документы\\Myfile2.txt",

                   O_WRONLY | O_CREAT | O_BINARY))==-1)

 {

    MessageBox(NULL, "Файл создать не удалось", "Ошибка", MB_OK);

    return -1;

 }

   write(handle, s,  strlen(s)+1);

   close(handle);

// Запуск второго потока

   start_thread(i);

// Перевод семафора в сигнальное состояние

MessageBox(NULL, "Для освобождения семафора нажмите OK", "Сообщение",  MB_OK);

   ReleaseSemaphore(semaphore1,1,0);

// Завершение работы программы

   printf("\n\n Press <Enter> for end program");

   getchar();

   return 0;

}