用c语言或c++编写编程实现生产者消费者或读写者的同步问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言或c++编写编程实现生产者消费者或读写者的同步问题相关的知识,希望对你有一定的参考价值。

操作系统实验二
题目:编程实现生产者消费者或读写者的同步问题

⒈ 问题描述
编程实现生产者消费者或读写者的同步问题,目标掌握信号量实现进程同步及其应用
⒉ 基本要求
1) 利用线程模拟进程
2) 可视化显示模拟同步

⒊ 实现提示
设计在同一个进程地址空间内执行的多个线程。生产者线程和消费者线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若无满的缓冲区,消费者线程将被阻塞,直到新的物品被生产出来。
需要使用如下信号量:
一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
一个信号量,用于当缓冲区满时让生产者线程等待;
一个信号量,用于当缓冲区空时让消费者线程等待;

利用Windows提供的API函数,例如创建线程的函数CreateThread()、创建互斥对象函数CreateMutex()和创建信号量函数CreateSemaphore()等,自己上网或去图书馆查资料实现。

参考技术A 实现一个队列CQueue
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 先得了解通信协议,个层次的追问

了解了之后该怎么做?

追答

可以看看网络环境高级编程

参考技术B TCP/IP协议详解卷一
Unix网络编程
TCP/IP协议详解卷二

我也想过你这个想法,然后还在慢慢看书,看例子,首先要抓包。追问

我一开始没看资料,直接下了一个抓包软件然后先抓了包。。。

参考技术C 利用pcaplib库可以实现
我写过一个简单的程序,如果需要,我可以发给你追问

那是什么库。干嘛的?。。简单的?是抓包的吗?

追答

嗯,抓包用的,挺方便的,你上网查查吧

以上是关于用c语言或c++编写编程实现生产者消费者或读写者的同步问题的主要内容,如果未能解决你的问题,请参考以下文章

Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

创建 DLL 的编程语言:C++ 或 C#

怎么用C或C++来编写一个抓包程序,或者是编写一个能够保存抓出的包然后分析出结果的程序,要个思路!

用C或C++编程实现数据库的查询,添加,删除,修改功能。

生产者-消费者”问题 用C语言编写

C++实现数据库连接池