c语言编程每个商品有一个商品id,用c语言或c++编写编程实现生产者消费者或读写者的同步问题...

满意答案

00e27ab806e4881f8254fe7ae8741834.png

guiyjgg2830

2013.09.12

00e27ab806e4881f8254fe7ae8741834.png

采纳率:45%    等级:12

已帮助:6196人

实现一个队列CQueue

CQueue提供两个公有成员函数

addTail():往队列尾部增加一个元素

removeHead():读出并移除队列的第一个元素

生产者:两个线程通过调用CQueue::addTail()往队列中增加元素

消费者:一个线程通过调用CQueue::removeHead()从队列中读取元素

#include

#include

#include

#include

using namespace std;

#define P(sem) WaitForSingleObject(sem,INFINITE)

#define V(sem) ReleaseSemaphore(sem,1,NULL)

class CQueue

{

public:

void addTail();//往队列尾部增加一个元素

void removeHead();//读出并移除队列的第一个元素

private:

list L;

};

CQueue buffer;//全局的缓冲区

const int buf_size = 10;//缓冲区大小

static int GOODS_ID = 0;//商品序号

const int producers = 3;//生产者数量

const int consumers = 8;//消费者数量

void ProducerThread(void* param);

void ConsumerThread(void* param);

HANDLE empty,occupy,op_mutex;

int main()

{

int i;

int p_id[producers],c_id[consumers];

occupy = CreateSemaphore(NULL,0,buf_size,NULL);//占用位置

empty = CreateSemaphore(NULL,buf_size,buf_size,NULL);//空余位置

op_mutex = CreateSemaphore(NULL,1,1,NULL);//操作互斥量

for(i=0;i

{

p_id[i] = i+1;

_beginthread(ProducerThread,0,p_id+i);

}

for(i=0;i

{

c_id[i] = i+1;

_beginthread(ConsumerThread,0,c_id+i);

}

while(getchar()=='\n') break;

return 0;

}

void CQueue::addTail()

{

L.insert(L.end(),++GOODS_ID);

}

void CQueue::removeHead()

{

cout<

L.erase(L.begin());

}

void ProducerThread(void* param)

{

int id = *(int*)param;

while(1)

{

P(empty);

P(op_mutex);

Sleep(100);

buffer.addTail();

printf("Producer_%d produced %d\n",id,GOODS_ID);

V(op_mutex);

V(occupy);

}

}

void ConsumerThread(void* param)

{

int id = *(int*)param;

while(1)

{

P(occupy);

P(op_mutex);

Sleep(100);

printf("Consumer_%d consumed ",id);

buffer.removeHead();

V(op_mutex);

V(empty);

}

}

50分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值