Linux C++ 使用condition实现阻塞队列的方法

作者:jingxian 时间:2023-11-12 10:09:45 

实例如下:


/*
* BlockingQueue.h
*
* Created on: 2014年6月10日
*   Author:
*/

#ifndef BLOCKINGQUEUE_H_
#define BLOCKINGQUEUE_H_

#include <iostream>
#include <pthread.h>

using namespace std;

//template <typename T >
class BlockingQueue
{
public:
BlockingQueue();
BlockingQueue(int capacity);
~BlockingQueue();

bool push(int item);
int poll();

private:
int capacity;
int* queue;
int head,tail;
pthread_mutex_t mutex;
pthread_cond_t notFull,notEmpty;
};

#endif /* BLOCKINGQUEUE_H_ */

/*
 * BlockingQueue.cpp
 *
 *  Created on: 2014年6月10日
 *      Author:
 */
#include "../include/BlockingQueue.h"

BlockingQueue::BlockingQueue()
{
    this->capacity = 10;
    queue = new int[capacity];
    head = 0,tail = 0;
    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&notFull,NULL);
    pthread_cond_init(&notEmpty,NULL);

}

BlockingQueue::BlockingQueue(int capacity)
{
    this->capacity = capacity;
    queue = new int[capacity];
    cout << "capacity " << sizeof(queue) << endl;
    head = 0,tail = 0;
    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&notFull,NULL);
    pthread_cond_init(&notEmpty,NULL);

}

BlockingQueue::~BlockingQueue()
{
    this->capacity = 0;
    head = 0,tail = 0;
    delete queue;
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&notFull);
    pthread_cond_destroy(&notEmpty);
}

bool BlockingQueue::push(int item)
{
    pthread_mutex_lock(&mutex);
    cout << "you want push " << item << endl;
    while((head + 1) % capacity == tail)//is full
    {
        cout << "is full,wait..." << endl;
        // push wait
        pthread_cond_wait(&notFull,&mutex);
        cout << "not full,unlock" << endl;
    }

    {
        queue[head] = item;
        head = (head + 1) % capacity;
        cout << "push " << item << endl;
        //wake up poll thread
        pthread_cond_signal(&notEmpty);
        pthread_mutex_unlock(&mutex);

        return true;
    }
}

int BlockingQueue::poll()
{
    pthread_mutex_lock(&mutex);
    int ret = 0;
    while(head == tail) // is empty
    {
        cout << "is empty,wait..." << endl;
        //poll wait
        pthread_cond_wait(&notEmpty,&mutex);
        cout << "not empty,unlock..." << endl;
    }
    {
        ret = queue[tail];
        tail = (tail + 1) % capacity;
        cout << "take " << ret << endl;
        //wake up push thread
        pthread_cond_signal(&notFull);

        pthread_mutex_unlock(&mutex);
        return ret;
    }
}


#include <iostream>
#include "include/BlockingQueue.h"
using namespace std;
BlockingQueue queue(3);

void* put(void *)
{
queue.push(1);
 queue.push(2);
 queue.push(3);
 queue.push(4);
 queue.push(5);
 return NULL;
}

void* take(void *)
{
queue.poll();
queue.poll();
queue.poll();
return NULL;
}

int main() {

pthread_t put1,take1;
 pthread_create(&put1,NULL,put,0);
 pthread_create(&take1,NULL,take,0);

void * retval;
 pthread_join(put1,&retval);
 pthread_join(take1,&retval);

return 0;
}
标签:阻塞队列,linux
0
投稿

猜你喜欢

  • 网站友情链接的SEO基本技巧

    2008-07-23 13:04:00
  • 编辑与谷歌有意思的博弈 SEO的最后一课

    2009-02-19 17:29:00
  • Text Link Ads注册申请中文图文教程

    2008-01-19 13:51:00
  • 如果你做站的热情未减 渴望成功 请看这篇文章

    2007-10-12 12:18:00
  • 解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”

    2023-08-05 00:51:10
  • 网易邮箱收不到GoDaddy系统发来的邮件

    2010-04-08 12:40:00
  • 10招提高你的WordPress安全性

    2008-04-21 11:20:00
  • 支持开源 英特尔为云计算提供测试平台

    2009-10-12 13:47:00
  • 磨刀霍霍去建站 先看网站建设的10个规划

    2009-01-23 11:55:00
  • PayPal购买Godaddy Deluxe Plan详细图解

    2010-04-20 13:20:00
  • 浅析Hyper-V安装CentOS 8问题

    2021-01-21 11:18:03
  • iis7中session丢失的解决方法小结

    2021-09-28 09:44:26
  • DNSPod遭遇10G流量恶意攻击

    2010-02-21 10:37:00
  • Alexa排名和各项数据说明

    2008-02-03 13:43:00
  • 谈谈百度GGAD和阿里妈妈谁更适合我们小站长

    2008-06-24 11:24:00
  • 浅谈Discuz论坛的内部优化功能(实例演示)

    2009-03-15 20:24:00
  • 主题与关系并举提升网络社区的价值

    2009-02-15 09:51:00
  • 使用Xshell连接VMware上的Linux虚拟机(图文步骤)

    2021-10-29 21:15:10
  • 借用SSL验证,让IIS信息访问更安全(3)

    2007-03-27 09:46:00
  • Linux运维之如何使用ss命令代替netstat

    2021-07-01 00:53:23
  • asp之家 网站运营 m.aspxhome.com