C++生产者消费者的实现与总结

线程A负责打印数组 线程B负责向数组中push一个元素,做到每push10个元素 线程A就执行一次打印。
这个问题可以用生产者消费者模型来解决。

#include <iostream>
#include <mutex>
#include <vector>
#include <thread>
#include <time.h>

using namespace std;

volatile int g_count = 10;

mutex lock_;
condition_variable cond_;
condition_variable cond2_;
vector<int> arr_;


void print_func()
{
  while (1)
  {
    unique_lock<mutex> lock(lock_);
    while (g_count > 0) {
        cond_.wait(lock_);
    }
    cout << "haha: " << arr_.size() << endl;
    g_count = 10;
    arr_.clear();
    cond2_.notify_all();
  }

}


void push_func()
{
    while(1)
    {
      unique_lock<mutex> lock(lock_);

      while (g_count == 0){
          cond2_.wait(lock_);
      }

      arr_.push_back(1);
      g_count--;
      sleep(1);
      cout << "push count: " << g_count << endl;
      if(g_count == 0)
      {
          cond_.notify_all();
      }


    }

}


int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";

    thread print_thread(print_func);
    thread push_thread(push_func);

    print_thread.join();
    push_thread.join();


    return 0;
}

代码总结:
条件变量的使用:

  • 条件变量是在拿到锁之后才能使用的,在调用条件变量时,会将拿到的锁释放掉,然后线程就处于等待状态,直到条件满足(收到信号),然后返回时会继续把锁锁定。
  • 条件变量处一定要用while,不能使用if判断,因为在条件满足以后,其他线程可能会通过广播的方式来通知所有线程条件满足,此时,可能会有其他线程已经最公共变量进行修改了,需要对公共变量继续判断之后再继续运行。
  • 在条件满足并执行任务后,一定要释放锁再发消息,原因是,其他等待线程在条件等待处返回时,会将锁锁上,如果未释放锁,则条件满足的线程仍然会处于等待状态。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值