线程安全 阻塞队列

#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <pthread.h>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
std::queue<int> que;
std::mutex mt;
const int maxn=5;
std::condition_variable p,c;
using namespace std;
int id=0;

template <typename  T>
class Tqueue {
public:
    int _capacity;
    Tqueue(int capacity):_capacity(capacity){}
    std::queue<T> que1;

    T push(T val){
        std::unique_lock<mutex> uni(mt);
        p.wait(uni, [&]() -> int { return que.size() < _capacity; });
        que.push(id);
        printf("push %d\n", id);
        if (que.size() == 1) {
            c.notify_one();
        }
        c.notify_one();
    }
    T  pop(){
        std::unique_lock<mutex> uni(mt);
        c.wait(uni, []() -> int { return !que.empty(); });
        int x = que.front();
        que.pop();
        printf("pop %d\n", x);
        p.notify_one();
        return x;
    }

    T front(){
        std::unique_lock<mutex> uni(mt);
        c.wait(uni, []() -> int { return !que.empty(); });
        T x = que.front();
        printf("front() %d\n", x);
        return  x;
    }
};
void produce(Tqueue<int> &tque){
    while(id<100) {
        tque.push(++id);
       // sleep(1);
    }
}
void consume(Tqueue<int> &tque){
   while(id<20) {
       tque.pop();
       //sleep(1);
   }
}

int main() {

    Tqueue<int> tque(5);
    std::cout << "starting first helper...\n";
    std::thread helper1(produce,std::ref(tque));

    std::cout << "starting second helper...\n";
    std::thread helper2(consume,std::ref(tque));

    std::cout << "waiting for helpers to finish..." << std::endl;
    helper1.join();
    helper2.join();

    std::cout << "done!\n";

return 0;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值