日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

c语言p,用C语言实现P、V操作

發(fā)布時(shí)間:2025/3/20 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言p,用C语言实现P、V操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

該樓層疑似違規(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。