www.pudn.com > 操作系统pv操作.rar > P.CPP
#include#include //缓冲区和信号量 HANDLE g_hBuffer = NULL; HANDLE g_hSemSynR = NULL, g_hSemSynM = NULL, g_hSemSynP = NULL; char* g_pszBuffer = NULL; //在缓冲区中的位置指针 unsigned char g_nR = 0, g_nM = 0, g_nP = 0; //P,V操作 void P(HANDLE hSem) { WaitForSingleObject(hSem, INFINITE); } void V(HANDLE hSem) { ReleaseSemaphore(hSem, 1, NULL); } void main() { //创建共享内存,大小为320 + 3B=10条记录 + 3个指针 g_hBuffer = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 323, "my_buffer"); if(g_hBuffer == NULL)// 如果创建失败 { printf("创建或连接共享内存失败!\n"); return; } else if(GetLastError() == ERROR_ALREADY_EXISTS) { //如果已经存在这个同名对象, 说明共享内存已经创建 g_pszBuffer = (char*)MapViewOfFile(g_hBuffer, FILE_MAP_WRITE | FILE_MAP_READ, 0,0,0); unsigned char *pnPoint = (unsigned char*)g_pszBuffer; g_nR = pnPoint[0]; g_nM = pnPoint[1]; g_nP = pnPoint[2]; } else { // 经过上面的检查, 说明这是第一次创建共享内存 g_pszBuffer = (char*)MapViewOfFile(g_hBuffer, FILE_MAP_WRITE | FILE_MAP_READ, 0,0,0); // 初始化内存 memset(g_pszBuffer, 0, 323); g_nR = g_nM = g_nP = 0; } //创建信号量 g_hSemSynR = CreateSemaphore(NULL, 10, 10, "my_sem_R"); g_hSemSynM = CreateSemaphore(NULL, 0, 10, "my_sem_M"); g_hSemSynP = CreateSemaphore(NULL, 0, 10, "my_sem_P"); if(g_hSemSynR == NULL || g_hSemSynM == NULL || g_hSemSynP == NULL) {// 如果创建失败 printf("创建或连接信号量失败!\n"); return; } //以上的代码对所有的程序都是一样的 //下面开始你自己的工作============================ BOOL end = FALSE; while(!end) { char data[32]; printf("\tP(synP)\n"); P(g_hSemSynP); g_nP = g_pszBuffer[2]; strncpy(data, g_pszBuffer + 3 + g_nP * 32, 32); printf("\t处理后的数据:%s\n",data); g_pszBuffer[2] = g_nP = (g_nP + 1) % 10; printf("\tV(synR)\n"); V(g_hSemSynR); char endCH; printf("Go on? "); fflush(stdin); scanf("%c", &endCH); if(endCH != 'y' && endCH != 'Y' ) end = TRUE; } //自己的代码到此结束=========================== UnmapViewOfFile(g_pszBuffer); CloseHandle(g_hBuffer); return; }