Шаг 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)

Введите букву в программу записи и Enter, и программа чтения тут же опомнится и прочитает данные. Вот оно понятие сихронизации. Кстати данный механизм можно применять не только для записи/чтения файлов, но и для любой синхронизации между потоками, программами или еще чем.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 12.02.2000