c语言p,用C语言实现P、V操作
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
操作系統(tǒng)中關(guān)于信號(hào)量操作的代碼示例(Linux+windows)
原文:操作系統(tǒng)中關(guān)于信號(hào)量操作的代碼示例(Linux+windows)
有一個(gè)生產(chǎn)者進(jìn)程,有兩個(gè)消費(fèi)者進(jìn)程。生產(chǎn)者產(chǎn)生1-100的100個(gè)數(shù)。兩個(gè)消費(fèi)者從共享內(nèi)存中取數(shù)。
/*windows?部分*/
//?Thread.cpp?:?定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//-----------Windows下生產(chǎn)者、消費(fèi)者實(shí)例程序---------------------
//--------------author:zhangwei----------------------------------
//--------------Date?12/10/2004---------------------------------
#include?"stdafx.h"
//作為倉庫存放數(shù)據(jù),最多可以放五個(gè)數(shù)據(jù)
int?array[5];
//記錄生成數(shù)據(jù)的個(gè)數(shù)
int?pointer;
//記錄取得的數(shù)據(jù)的位置
int?pointerget;
//用來保存數(shù)據(jù)和
int?sum;
//臨界區(qū)對(duì)象
CRITICAL_SECTION?csArray;
//句柄,保存Full信號(hào)量
HANDLE?hFull;
//句柄,保存Empty信號(hào)量
HANDLE?hEmpty;
//生產(chǎn)者函數(shù)
DWORD?WINAPI?Producer(LPVOID?lpParam)
{
int?i?=?0;
pointer?=?0;
while(?i?
{
WaitForSingleObject(hEmpty,INFINITE);
EnterCriticalSection(?&csArray);
array[(pointer++)%5]?=?i?+?1;
LeaveCriticalSection(?&csArray);
ReleaseSemaphore(hFull,1,NULL);
i++;
}
return?0;
}
//消費(fèi)者函數(shù)A
DWORD?WINAPI?ConsumerA(LPVOID?lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection(?&csArray);
sum?+=?array[(pointerget?++?)%5];
printf("ConsumerA?get?%d?\n",array[(pointerget?-1)%5]);
if(pointerget?==?100)
printf("The?sum?is?%d",sum);
LeaveCriticalSection(?&csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return?0;
}
//消費(fèi)者函數(shù)B
DWORD?WINAPI?ConsumerB(LPVOID?lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection(?&csArray);
sum?+=?array[(pointerget?++?)%5];
printf("ConsumerB?get?%d?\n",array[(pointerget?-1?)%5]);
if(pointerget?==?100)
printf("The?sum?is?%d",sum);
LeaveCriticalSection(?&csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return?0;
}
//主函數(shù)
void?main()
{
HANDLE?hThreadProducer,hThreadConsumerA,hThreadComsumerB;
sum?=?0;
pointerget?=?0;
InitializeCriticalSection(?&csArray);
hFull?=?CreateSemaphore(NULL,0,5,NULL);
hEmpty?=?CreateSemaphore(NULL,5,5,NULL);
hThreadProducer?=?CreateThread(NULL,0,
Producer,NULL,0,NULL);
hThreadConsumerA?=?CreateThread(NULL,0,
ConsumerA,NULL,0,NULL);
hThreadComsumerB?=?CreateThread(NULL,0,
ConsumerB,NULL,0,NULL);
_getch();
}
/*Linux?部分*/
#include
#include
#include?
#include
#include
#include
#include
#include
#define?MAXSEM?5
//聲明三個(gè)信號(hào)燈ID
int?fullid;
int?emptyid;
int?mutxid;
int?main()
{
struct?sembuf?P,V;;
union?semun?arg;
//聲明共享內(nèi)存
int?*array;
int?*sum;
int?*set;
int?*get;
//映射共享內(nèi)存
array?=?(int?*)mmap(NULL?,?sizeof(?int?)*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
sum?=?(int?*)mmap(NULL?,?sizeof(?int?),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
get?=?(int?*)mmap(NULL?,?sizeof(?int?),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
set?=?(int?*)mmap(NULL?,?sizeof(?int?),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
*sum?=?0;
*get?=?0;
*set?=?0;
//生成信號(hào)燈
fullid=?semget(IPC_PRIVATE,1,IPC_CREAT|00666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
//為信號(hào)燈賦值
arg.val?=?0;
if(semctl(fullid?,?0?,?SETVAL?,?arg)?==?-1)?perror("semctl?setval?error");
arg.val?=?MAXSEM;
if(semctl(emptyid?,?0?,SETVAL?,?arg)?==?-1)?perror("semctl?setval?error");
arg.val?=?1;
if(semctl(mutxid?,?0?,SETVAL?,?arg)?==?-1)?perror("setctl?setval?error");
//初始化P,V操作
V.sem_num=0;
V.sem_op?=1;
V.sem_flg=SEM_UNDO;
P.sem_num=0;
P.sem_op?=-1;
P.sem_flg=SEM_UNDO;
//生產(chǎn)者進(jìn)程
if(fork()?==?0?)?{
int?i?=?0;
while(?i?
{
semop(emptyid?,?&P?,1?);
semop(mutxid?,?&P?,?1);
array[*(set)%MAXSEM]?=?i?+?1;
printf("Producer?%d\n",?array[(*set)%MAXSEM]);
(*set)++;
semop(mutxid?,?&V?,?1);
semop(fullid?,?&V?,?1);
i++;
}
sleep(10);
printf("Producer?is?over");
exit(0);
}else?{
//ConsumerA?進(jìn)程
if(fork()==0)?{
while(1){
semop(fullid?,?&P?,?1);
semop(mutxid?,?&P?,?1);
if(*get?==?100)
break;
*sum?+=?array[(*get)%MAXSEM];
printf("The?ComsumerA?Get?Number?%d\n",?array[(*get)%MAXSEM]?);
(*get)++;
if(?*get?==100)
printf("The?sum?is?%d?\n?",?*sum);
semop(mutxid?,?&V?,?1);
semop(emptyid?,?&V?,1?);
sleep(1);
}
printf("ConsumerA?is?over");
exit(0);
}else?{
//Consumer?B進(jìn)程
if(fork()==0)?{
while(1){
semop(fullid?,?&P?,?1);
semop(mutxid?,?&P?,?1);
if(*get?==?100)
break;
*sum?+=?array[(*get)%MAXSEM];
printf("The?ComsumerB?Get?Number?%d\n",?array[(*get)%MAXSEM]?);
(*get)++;
if(?*get?==100)
printf("The?sum?is?%d?\n?",?*sum);
semop(mutxid?,?&V?,?1);
semop(emptyid?,?&V?,1?);
sleep(1);
}
printf("ConsumerB?is?over");
exit(0);
}
}
}
//?sleep(20);
return?0;
}
我的第一篇文章,多多指教。如需練習(xí)mail:dawei_zhang81@163.com
總結(jié)
以上是生活随笔為你收集整理的c语言p,用C语言实现P、V操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pt100 c 语言,PT100计算公式
- 下一篇: 二级c语言努力学可以过吗,考过计算机二级