c++多线程队列的实现

http://www.eifr.com/article.php?id=630

以下代码是在linux下kdevelop环境中编写的,测试通过。

接下来是代码:(改了一下,加了个锁)

/*
*创建人:xcl 时间:2012.2.26
*说明:MyQueue类
*/
#ifndef MYQUEUE_H_
#define MYQUEUE_H_

#include <pthread.h>
#include <iostream>
using namespace std;

const int QUEUESIZE = 20;
//类模型--------------------------------------
class  MyQueue
{    public:
    MyQueue();
    ~MyQueue();
    public:
    void Push(int key);
    int Pop();
    int GetSize();
    bool IsFull();
    bool IsEmpty();
    private:
    int rear;
    int front;
    int size;
    int list[QUEUESIZE];
    pthread_mutex_t queMutex;    //新加的锁    
};
//构造函数-----------------------------------------
MyQueue::MyQueue()
{
    rear=front=0;
    size=QUEUESIZE;    
    pthread_mutex_lock(&queMutex);
    pthread_mutex_init(&queMutex,NULL);    //初始化锁
}
//入队操作----------------------------------------
void MyQueue::Push(int key)
{
    pthread_mutex_lock(&queMutex);
    if(IsFull())
    {
        cout << "queue is full!" << endl;
        pthread_mutex_unlock(&queMutex);
        return;
    }            
    list[rear]=key;
    cout << "正在入队:"<< key <<endl;
    rear =(rear+1)%size;
    pthread_mutex_unlock(&queMutex);    
}
//出队操作-----------------------------------------
int MyQueue::Pop()
{    
    int temp;
    pthread_mutex_lock(&queMutex);
    if(IsEmpty())
    {
        cout << "the queue is empty!"<< endl;
        pthread_mutex_unlock(&queMutex);
        return false;
    }    
    temp=list[front];
    cout << "正在出队~:"<< temp <<endl;    
    front=(front+1)%size;
    pthread_mutex_unlock(&queMutex);
    return temp;
}
//获取队列实际大小-----------------------------------
int MyQueue::GetSize()
{
    int realSize;
    pthread_mutex_lock(&queMutex);
    realSize=(rear-front)%size;
    pthread_mutex_unlock(&queMutex);
    return realSize;
}
//判断队列是否为满--------------------------------------
bool MyQueue::IsFull()
{
    if((rear+1)%size==front)
        return true;
    else 
        return false;    
}
//判断队列是否为空-------------------------------------
bool MyQueue::IsEmpty()
{
    if(front==rear)
        return true;
    else 
        return false;
}
#endif


以下是主程序代码:

/***************************************************************************
 *   Copyright (C) 2012 by root   *
 *   root@localhost.xcl   *
 **************************************************************************/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include "MyQueue.h"
#include <pthread.h>
//解决方案:写个C函数,然后再C函数中调用C++对象的成员函数。
using namespace std;
MyQueue *Q;     //全局对象;
void showSize() //统计队列中实际数据的个数
{
    int size;
    size=Q->GetSize();
    cout << "当前队列拥有的数据是:" << size <<endl;    
}
void *pushed(void *args)
{    
    for(int i = 0; i < 10; ++i)
    {
        Q->Push(i+10);
        showSize();        
        sleep(1);            
    }    
    return NULL;
}
void* poped(void *args)
{
    int popData;
    for(int i = 0;i < 10;++i)
    {
        popData = Q->Pop();
        showSize();        
        sleep(2);    
    }
    return NULL;
}
void showHelp()
{
    cout <<"功能:  多线程队列,同时出入队.\n\t实时统计当前队列中实际数据个数。\n"<<
    "\t实际数据从10开始。\n\n"<< endl;
}

int main(int argc, char *argv[])
{
    showHelp();
    
    int size,ret_push,ret_pop;
    Q = new MyQueue();   //实例化对象
    pthread_t id_push; //入队线程
    pthread_t id_pop;  //出队线程
    ret_push = pthread_create(&id_push,NULL,pushed,NULL);
    
    ret_pop = pthread_create(&id_pop,NULL,poped,NULL);
    
    pthread_join(id_push,NULL);
    
    pthread_join(id_pop,NULL);    
      return EXIT_SUCCESS;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++实现线程共享队列可以使用标准库中的 std::queue 和 std::mutex 来实现。具体实现步骤如下: 1. 定义一个模板类,用于表示队列中的元素类型; 2. 在队列类中定义两个 std::queue 成员变量,一个用于存储任务,另一个用于存储等待的线程; 3. 定义一个 std::mutex 对象,用于保护队列的数据; 4. 在队列类中定义 push() 和 pop() 函数,这两个函数需要使用 std::lock_guard<std::mutex> 对象来保护队列的数据; 5. 在 push() 函数中向任务队列中添加任务,并通知等待的线程有新任务加入; 6. 在 pop() 函数中从任务队列中取出一个任务并返回,如果队列为空则等待新任务的到来。 下面是一个简单的多线程共享队列实现: ```c++ #include <queue> #include <mutex> #include <condition_variable> template<typename T> class ThreadSafeQueue { public: ThreadSafeQueue() = default; void push(const T& value) { std::lock_guard<std::mutex> lock(m_mutex); m_queue.push(value); m_condition.notify_one(); } bool pop(T& value) { std::unique_lock<std::mutex> lock(m_mutex); m_condition.wait(lock, [this]{ return !m_queue.empty(); }); if (m_queue.empty()) { return false; } value = m_queue.front(); m_queue.pop(); return true; } private: std::queue<T> m_queue; mutable std::mutex m_mutex; std::condition_variable m_condition; }; ``` 在上面的代码中,我们使用 std::unique_lock<std::mutex> 来保护队列的数据,并使用 std::condition_variable 来通知等待的线程有新任务加入。在 push() 函数中,我们先获取 std::lock_guard<std::mutex> 对象来保护队列的数据,然后向任务队列中添加任务,并通过 m_condition.notify_one() 通知等待的线程有新任务加入。在 pop() 函数中,我们获取 std::unique_lock<std::mutex> 对象来保护队列的数据,并通过 m_condition.wait() 等待新任务的到来。如果队列中有任务,则取出一个任务并返回,否则返回 false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值