生产消费1

#include "stdio.h"

#include "string.h"

#include <iostream>

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

class Product

{

private:

int  mId;

public:

Product( int id ):mId(id){}

Product( ):mId(-1){};

//Product( const Product &p){mId = p.mId;}

int GetId( ){return mId;}

};

class ProductPool

{

private:

int mCount;

int mPoint;

Product *maProductQueue;

public:

ProductPool(int iCount):mPoint(0),mCount(iCount)

{

maProductQueue = new Product[iCount];

}

~ProductPool()

{

delete maProductQueue;

}

bool IsFull(){return mPoint == mCount? true:false;}

bool IsEmpty(){return mPoint == 0?true:false;}

bool putProduct()

{

//sleep(1);

if ( IsFull() )

{

std::cout<<"Is Full!!!"<<std::endl;

return false;

}

std::cout<<"Produce a product:id = "<<mPoint<<std::endl;

maProductQueue[mPoint++] = Product(mPoint);

return true;

}

Product* getProduct()

{

//sleep(1);

if ( IsEmpty() )

{

std::cout<<"Is Empty!!!"<<std::endl;

return NULL;

}

std::cout<<"Consume a product:id = "<<mPoint-1<<std::endl;

return &maProductQueue[--mPoint];

}

};

class Producer

{

private:

int mId;

ProductPool *mProductPool;

public:

Producer( int id ,ProductPool *rProductPool):mId(id),mProductPool(rProductPool){};

void Produce( )

{

while( true )

{

pthread_mutex_lock(&mutex);

std::cout<<"I am producer,id = "<<mId<<",I produce a product"<<std::endl;

mProductPool->putProduct();

pthread_mutex_unlock(&mutex);

}

}

static void* ProduceThreadProc( void *rThis)

{

Producer *p = (Producer*)rThis;

p->Produce();

}

};

class Consumer

{

private:

int mId;

ProductPool *mProductPool;

public:

Consumer(int id,ProductPool *rProductPool):mId(id),mProductPool(rProductPool){};

void Consume()

{

while( true )

{

pthread_mutex_lock(&mutex);

std::cout<<"I am consumer,id = "<<mId<<",I consume a product"<<std::endl;

mProductPool->getProduct();

pthread_mutex_unlock(&mutex);

}

}

static void* ConsumeThreadProc(void *rThis)

{

Consumer *p = (Consumer*)rThis;

p->Consume();

}

};

int main()

{

pthread_t tids[2];

ProductPool aProductPool(10);

Producer *aP = new Producer(1,&aProductPool);

Consumer *aC = new Consumer(2,&aProductPool);

pthread_create(&tids[0],NULL,Producer::ProduceThreadProc,(void*)aP);

pthread_create(&tids[1],NULL,Consumer::ConsumeThreadProc,(void*)aC);

pthread_join(tids[0],NULL);

pthread_join(tids[1],NULL);

return 0;

}

时间: 2024-11-06 03:36:50

生产消费1的相关文章

3、传统线程同步与通信--生产消费例子

核心点: 1.锁对象必须是同一个. 2.wait()和notify()方法必须是调用锁对象的方法,而非this(线程)的. 3.在多生产多消费的时候注意使用notifyAll而不是notifyAll,否则会造成死锁 测试代码: 1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Random; 4 5 /** 6 * 多个生产 - 消费 线程同步通信 7 * 核心点: 8 * 1.锁对象必须是同一

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

多线程之生产消费

package mysd; public class Main { public static void main(String[] args) { DianY dy=new DianY(); ChangJ cj=new ChangJ(dy); Xiaof xf=new Xiaof(dy); Thread td=new Thread(cj); Thread td2=new Thread(cj); Thread td1=new Thread(xf); Thread td11=new Thread(

同步线程,生产消费案例。

public class ShareResourse { private String name ; private String gender; private boolean isEmpty=true;//表示为数据为空 /** * 生产者向共享资源中存储数据 * name 存贮的姓名 * gender 存储的性别 */ synchronized public void push (String name,String gender){ try { while(!isEmpty){//当前为

生产消费

线程同步 class SynStack { private char data[] = new char[6]; private int cnt = 0;// 表示数组有效元素的个数 public synchronized void push(char ch) { while (data.length == cnt) { try { this.wait(); } catch (Exception e) { } } this.notify(); data[cnt] = ch; cnt++; Sys

马老师的WoTou生产消费线程讲解例子

public class ProducerConsumer { public static void main(String[] args) { SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(p).start(); new Thread(p).start(); new Thread(c).

生产消费锁---信号灯模式

package com.Thread; public class Custom_Producer { public static void main(String[] args) { //共享资源 Production pro = new Production(); Custom custom = new Custom(pro); Producer producer = new Producer(pro); new Thread(producer).start(); new Thread(cus

Kafka创建&amp;查看topic,生产&amp;消费指定topic消息

启动zookeeper和Kafka之后,进入kafka目录(安装/启动kafka参考前面一章:https://www.cnblogs.com/cici20166/p/9425613.html) 1.创建Topic 1)运行命令: ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1 2181 是zookeeper 端口 图示为创建成

RocketMQ专题2:三种常用生产消费方式(顺序、广播、定时)以及顺序消费源码探究

顺序.广播.定时任务 前插 ? 在进行常用的三种消息类型例子展示的时候,我们先来说一说RocketMQ的几个重要概念: PullConsumer与PushConsumer:主要区别在于Pull与Push的区别.对于PullConsumer,消费者会主动从broker中拉取消息进行消费.而对于PushConsumer,会封装包含消息获取.消息处理以及其他相关操作的接口给程序调用 Tag: Tag可以看做是一个子主题(sub-topic),可以进一步细化主题下的相关子业务.提高程序的灵活性和可扩展性