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; 
}