Задача сводится к тому как заставить две программы работать с одним файлом, когда одна программа может писать, а вторая должна читать. Задача как избежать конфликтов при данной ситуации. Создадим два проекта, как 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 будет стоять пока доступ не будет получен. Запустите одновременно две программы. Программа чтения будет ждать пока программа записи не разрешит доступ. Кстати данный механизм можно применять не только для записи/чтения файлов, но и для любой синхронизации между потоками, программами или еще чем. |