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++生产者和消费者线程循环
线程安全-生产者消费者模型
100 1
|
7月前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
128 0
|
7月前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
178 0
|
7月前
|
Java C++
线程池-手写线程池C++11版本(生产者-消费者模型)
线程池-手写线程池C++11版本(生产者-消费者模型)
190 0
|
C++ 数据库
C++ 模拟生产者与消费者模式等
设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。需要使用如下信号量: 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号; 一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号。
1217 0
|
Linux C++
linux下c++實現簡單的生產者消費者隊列模式
引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區,實現產品的FIFO 生產者調用緩衝區的push函數,將產品加入緩衝區 消費者調用緩...
820 0
|
Windows
C++11 生产者消费者
下面是一个生产者消费者问题,来介绍condition_variable的用法。当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程。消费者wait 直到生产者通知其状态发生改变,Condition_variable是使用方法如下: ·当持有锁之后,线程调用wait ·wait解开持有的互斥锁(mutex),阻塞本线程,并将自己加入到唤醒队列中 ·当收到通知(notification),该线程从阻塞中恢复,并加入互斥锁队列(mutex queue)  线程被唤醒之后继续持有锁运行。
1173 0
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
105 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
94 4