// Semafor.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include int bag; int read_count; HANDLE hMapFile; LPVOID lpMapAddress; HANDLE Writing, Status; HANDLE CreateMap(HANDLE FileToBeMapped, LPCWSTR MapName) { HANDLE MapHandle; MapHandle= CreateFileMapping(FileToBeMapped, NULL, PAGE_READWRITE, 0, 4096, MapName); if (MapHandle == NULL) { printf("error: CreateFileMapping!\n"); return(NULL); } else return(MapHandle); } LPVOID MapView(HANDLE hMap) { LPVOID MappedPointer; MappedPointer= MapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 4096); if (MappedPointer == NULL) { printf("error: MapViewOfFile!\n"); return(NULL); } else return(MappedPointer); } LPVOID ReadBytes(LPVOID from, LPVOID to, DWORD len) { return(memcpy(to,from,len)); } LPVOID WriteBytes(LPVOID to, LPVOID from, DWORD len) { return(memcpy(to,from,len)); } void writer() { WaitForSingleObject(Writing, INFINITE); ReadBytes(lpMapAddress, &bag, sizeof(int)); bag++; WriteBytes(lpMapAddress, &bag, sizeof(int)); printf("am scris: %d\n", bag); ReleaseMutex(Writing); // Sleep(1000); } void reader() { WaitForSingleObject(Status, INFINITE); ReadBytes((int *)lpMapAddress+1, &read_count, sizeof(int)); read_count++; WriteBytes((int *)lpMapAddress+1, &read_count, sizeof(int)); if (read_count == 1) WaitForSingleObject(Writing, INFINITE); ReadBytes(lpMapAddress, &bag, sizeof(int)); printf("am citit: %d\n", bag); ReadBytes((int *)lpMapAddress + 1, &read_count, sizeof(int)); read_count--; WriteBytes((int *)lpMapAddress + 1, &read_count, sizeof(int)); if (!read_count) ReleaseMutex(Writing); ReleaseMutex(Status); // Sleep(500); } int _tmain(int argc, _TCHAR* argv[]) { bag = 1; read_count = 0; hMapFile = CreateMap((HANDLE) 0xFFFFFFFF, L"Warehouse"); lpMapAddress = MapView(hMapFile);//zona de memorie Writing = CreateMutex(NULL, TRUE, L"Writing"); if(GetLastError() != ERROR_ALREADY_EXISTS) { WriteBytes(lpMapAddress, &bag, sizeof(int)); ReleaseMutex(Writing); } Status = CreateMutex(NULL, TRUE, L"Status"); if(GetLastError() != ERROR_ALREADY_EXISTS) { WriteBytes((int *)lpMapAddress + 1, &read_count, sizeof(int)); ReleaseMutex(Status); } while (1) { writer (); reader (); writer (); reader (); Sleep (500); } return 0; }