C++11实现生产者消费者

简介: C++11实现生产者消费者

生产者消费者问题源码实现,使用c++11:

主要使用c++的锁和条件变量实现

/************************************
生产者消费者,多线程实现问题
有一个存储的队列
  生产者生产
  消费者取消费
1:注意:结构体作为参数,&是引用传递 *是地址传递
2:互斥锁的实现和条件变量
************************************/
#include <thread>
#include <mutex>
#include <condition_variable>
#include <unistd.h>
#include <iostream>
using namespace std;
//使用循环队列来进行存储消息
typedef struct buffer
{
  int buff[10];
  size_t read_position;
  size_t write_position;
  //采用互斥锁的方式实现生产和消费的异步取
  mutex mtx;
  condition_variable not_full; //可写信号
  condition_variable not_empty; //可读信号
  buffer()
  {
    read_position = 0;
    write_position = 0;
  };
}ring_buffer;
ring_buffer save_buffer;
void produce_item(ring_buffer *buffer, int i)
{
  //把i放入buffer中 要加锁
  unique_lock<mutex> lock(buffer->mtx);
  //根据标志,来等待或者存
  while((buffer->write_position+1)%10 == buffer->read_position)
  {
    cout<<"buffer is full now, producer is waiting \n"<<endl;
    (buffer->not_full).wait(lock);//等待释放锁的信号
  }
  //生产者加入数据
  (buffer->buff)[buffer->write_position] = i;
  buffer->write_position++;
  if(buffer->write_position == 10)
    buffer->write_position = 0;
  //给消费者发信号
  (buffer->not_empty).notify_all();
  lock.unlock();
}
int consumer_item(ring_buffer *buffer)
{
  //从buffer中取值返回 要加锁
  int data;
  unique_lock<mutex> lock(buffer->mtx);
  while(buffer->read_position == buffer->write_position)
  {
    cout<<"buffer is empty, consumer is waiting";
    (buffer->not_empty).wait(lock);
  }
  data = (buffer->buff)[buffer->read_position];
  buffer->read_position ++;
  if(buffer->read_position >= 10)
  {
    buffer->read_position = 0;
  }
  (buffer->not_full).notify_all();
  lock.unlock();
  return data;
}
//负责生产消息,放入队列中//根据写标志位写在对应位上
void producer()
{
  for(int i=0; i<100; i++)
  {
    produce_item(&save_buffer, i);
  }
}
void consumer()
{
  static int cnt = 0;
  while(1)
  {
    sleep(1);
    int item = consumer_item(&save_buffer);
    cout<<"consumer item is:"<<item<<endl;
    if(++cnt == 100)
    {
      break;
    }
  }
}
int main()
{
  thread produce(producer);
  thread consumes(consumer);
  produce.join();
  consumes.join();
  getchar();
  return 0;
}


目录
相关文章
|
安全 API C++
c++生产者和消费者线程循环
线程安全-生产者消费者模型
107 1
|
9月前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
146 0
|
9月前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
214 0
|
9月前
|
Java C++
线程池-手写线程池C++11版本(生产者-消费者模型)
线程池-手写线程池C++11版本(生产者-消费者模型)
205 0
|
C++ 数据库
C++ 模拟生产者与消费者模式等
设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。需要使用如下信号量: 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号; 一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号。
1224 0
|
Linux C++
linux下c++實現簡單的生產者消費者隊列模式
引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區,實現產品的FIFO 生產者調用緩衝區的push函數,將產品加入緩衝區 消費者調用緩...
829 0
|
Windows
C++11 生产者消费者
下面是一个生产者消费者问题,来介绍condition_variable的用法。当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程。消费者wait 直到生产者通知其状态发生改变,Condition_variable是使用方法如下: ·当持有锁之后,线程调用wait ·wait解开持有的互斥锁(mutex),阻塞本线程,并将自己加入到唤醒队列中 ·当收到通知(notification),该线程从阻塞中恢复,并加入互斥锁队列(mutex queue)  线程被唤醒之后继续持有锁运行。
1179 0
|
2天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
68 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
50 13