|
Шаг 9 - Синхронизация файловых операций Mutex.
Задача сводится к тому как заставить две программы работать с одним файлом, когда одна программа может писать, а вторая должна читать. Задача как избежать конфликтов при данной ситуации. Создадим два проекта, как Win32 console, один с именем WriteData, а другой с именем ReadData в каталоге TestMutex. Так будет и в прилагаемом проекте.
Код WriteFile
// WriteData.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "fstream.h"
#include "iostream.h"
void main()
{
HANDLE hShared = CreateMutex(NULL, TRUE, "WriteData");
ofstream ofs("d:\\write.txt");
ofs << "TestDataWrite" << endl;
ofs.close();
int i;
cout << "Press Key and Enter for access to file " << endl;
cin >> i;
ReleaseMutex(hShared);
CloseHandle(hShared);
}
Основа программы CreateMutex вот какая она
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES, // атрибуты
BOOL bInitialOwner, // инициализация
LPCTSTR lpName // имя обьекта
);
Теперь весь этот механизм запускается с помошью ReleaseMutex после использования указатель HANDLE нужно закрыть CloseHandle.
Код ReadData
// ReadData.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "fstream.h"
#include "iostream.h"
void main()
{
HANDLE hShared = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "WriteData");
cout << "Wait !!!! Write File Data Proccess " << endl;
WaitForSingleObject(hShared, INFINITE);
ifstream ifs("d:\\write.txt");
char buffer[100];
ifs >> buffer;
cout << "Read File Data - " << buffer << endl;
CloseHandle(hShared);
}
Для доступа к Mutex теперь его нужно открыть с тем же именем. И поставить флаг MUTEX_ALL_ACCESS. Функция WaitForSingleObject будет стоять пока доступ не будет получен.
Запустите одновременно две программы. Программа чтения будет ждать пока программа записи не разрешит доступ. Вот примерно так как на экране.
![9.gif (4757 b)](9.gif)
Введите букву в программу записи и Enter, и программа чтения тут же опомнится и прочитает данные. Вот оно понятие сихронизации. Кстати данный механизм можно применять не только для записи/чтения файлов, но и для любой синхронизации между потоками, программами или еще чем.
Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|