用c语言或c++编写编程实现生产者消费者或读写者的同步问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言或c++编写编程实现生产者消费者或读写者的同步问题相关的知识,希望对你有一定的参考价值。
操作系统实验二
题目:编程实现生产者消费者或读写者的同步问题
⒈ 问题描述
编程实现生产者消费者或读写者的同步问题,目标掌握信号量实现进程同步及其应用
⒉ 基本要求
1) 利用线程模拟进程
2) 可视化显示模拟同步
⒊ 实现提示
设计在同一个进程地址空间内执行的多个线程。生产者线程和消费者线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若无满的缓冲区,消费者线程将被阻塞,直到新的物品被生产出来。
需要使用如下信号量:
一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
一个信号量,用于当缓冲区满时让生产者线程等待;
一个信号量,用于当缓冲区空时让消费者线程等待;
利用Windows提供的API函数,例如创建线程的函数CreateThread()、创建互斥对象函数CreateMutex()和创建信号量函数CreateSemaphore()等,自己上网或去图书馆查资料实现。
CQueue提供两个公有成员函数
addTail():往队列尾部增加一个元素
removeHead():读出并移除队列的第一个元素
生产者:两个线程通过调用CQueue::addTail()往队列中增加元素
消费者:一个线程通过调用CQueue::removeHead()从队列中读取元素
#include <iostream>
#include <list>
#include <windows.h>
#include <process.h>
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<int> 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<producers;++i)
p_id[i] = i+1;
_beginthread(ProducerThread,0,p_id+i);
for(i=0;i<consumers;++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.begin()<<endl;
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);
本回答被提问者和网友采纳 参考技术B 连悬赏分都没有还让人回答??? 参考技术C 你师大的赵肥吧!
怎么用C或C++来编写一个抓包程序,或者是编写一个能够保存抓出的包然后分析出结果的程序,要个思路!
如题!我只有一点基础根本不知道该从哪方面下手去看去编!
参考技术A 先得了解通信协议,个层次的追问了解了之后该怎么做?
追答可以看看网络环境高级编程
Unix网络编程
TCP/IP协议详解卷二
我也想过你这个想法,然后还在慢慢看书,看例子,首先要抓包。追问
我一开始没看资料,直接下了一个抓包软件然后先抓了包。。。
参考技术C 利用pcaplib库可以实现我写过一个简单的程序,如果需要,我可以发给你追问
那是什么库。干嘛的?。。简单的?是抓包的吗?
追答嗯,抓包用的,挺方便的,你上网查查吧
以上是关于用c语言或c++编写编程实现生产者消费者或读写者的同步问题的主要内容,如果未能解决你的问题,请参考以下文章
Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型