`

Linux下 基于模板的C++多线程安全队列

阅读更多
/*
* ThreadQueue.h
*
* Created on: 2008-11-13
*      Author: root
*/

#ifndef THREADQUEUE_H_
#define THREADQUEUE_H_

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

using std::cout;
using std::endl;
const int QUEUESIZE = 20;

template<class Object>
class ThreadQueue
{
public:
    ThreadQueue();
    ~ThreadQueue();
public:
    bool Enter(Object *obj);
    Object* Out();
    bool IsEmpty();
    bool IsFull();
private:
    int front;
    int rear;
    int size;
    Object *list[QUEUESIZE];
    pthread_mutex_t queueMutex;
};

//------------------------------------------------------
template<class Object>
ThreadQueue<Object>::ThreadQueue()
{
    front = rear = 0;
    size = QUEUESIZE;

    pthread_mutex_lock(&queueMutex);
}
//------------------------------------------------------
template<class Object>
bool ThreadQueue<Object>::Enter(Object* obj)
{
    pthread_mutex_lock(&queueMutex);
    if(IsFull())
    {
        cout << "Queue is full!" << endl;
        pthread_mutex_unlock(&queueMutex);

        return false;
    }
    list[rear] = obj;
    rear = (rear + 1) % size;

    pthread_mutex_unlock(&queueMutex);

    return true;
}
//------------------------------------------------------
template<class Object>
Object* ThreadQueue<Object>::Out()
{
    Object* temp;
    pthread_mutex_lock(&queueMutex);
    if(IsEmpty())
    {
        cout << "Queue is empty!" << endl;
        pthread_mutex_unlock(&queueMutex);

        return false;
    }
    temp = list[front];
    front = (front + 1) % size;

    pthread_mutex_unlock(&queueMutex);

    return temp;
}
//------------------------------------------------------
template<class Object>
bool ThreadQueue<Object>::IsEmpty()
{
    if(rear == front)
        return true;
    else
        return false;
}
//------------------------------------------------------
template<class Object>
bool ThreadQueue<Object>::IsFull()
{
    if((rear + 1) % size == front)
        return true;
    else
        return false;
}
//------------------------------------------------------
template<class Object>
ThreadQueue<Object>::~ThreadQueue()
{
    delete []list;
}
//------------------------------------------------------


#endif /* THREADQUEUE_H_ */

以下为main.cpp
/*
* main.cpp
*
* Created on: 2008-11-13
*      Author: root
*/

#include "ThreadQueue.h"

#include <iostream>

using namespace std;

struct Data
{
    int fd ;
    //char buf[1024];
};

int main()
{
    ThreadQueue<Data> *t = new ThreadQueue<Data>();

    int k = 10;
    for(int i = 1; i <= 10; i++)
    {
        Data* d = new Data();
        d->fd = i;
    //    strcpy(d->buf,"AAAA");
        bool a = t->Enter(d);

        if(a)
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }


    Data *temp;
    //int *temp;
    for(int i = 1; i <= 10; i++)
    {
        //temp = t->Out();
        //cout << *temp << endl;
        temp = t->Out();

        cout << temp->fd << endl;

        //cout << temp->buf << endl;

        delete temp;
    }
    return 0;
}

 

1
0
分享到:
评论

相关推荐

    C++多线程编程总结,实例讲解.pdf

    文件中展示了如何在C++中安全地进行多线程队列操作。这里使用了 `task_queue_t` 类,其中包含 `produce` 和 `consume` 方法,分别用于向队列中添加任务和从队列中获取任务。 - `produce` 方法中,首先使用 `lock_...

    Linux下面C++实现的threadpool代码

    在Linux系统中,C++实现的线程池是一种优化多线程编程的技术,它通过预先创建一组线程,而不是在需要时才动态创建,从而提高了程序的效率和响应速度。线程池的主要思想是减少线程的创建和销毁开销,提供任务调度的...

    linux线程池代码(c++实现)

    在Linux系统中,线程池是一种高效的多线程管理机制,它通过预先创建一组线程,然后将任务分配给这些线程执行,从而避免频繁地创建和销毁线程带来的开销。C++作为一门强大的系统编程语言,可以方便地实现线程池。下面...

    linux 应用软件 c/c++ 面试题

    在Linux环境下进行C/C++应用软件的开发,面试时可能会涉及到多个方面的问题,这些知识点涵盖了操作系统原理、编程语言特性、软件工程以及系统级编程等多个领域。以下是一些可能的面试重点: 1. **C/C++语言基础**:...

    基于 C/C++实现的 DJ 混音软件源码,支持GNU/Linux, Windows, 和macOS

    标题中的“基于 C/C++实现的 DJ 混音软件源码,支持GNU/Linux, Windows, 和macOS”表明这是一个跨平台的DJ混音软件项目,使用C++编程语言编写,能够运行在三种主流操作系统上:GNU/Linux、Windows和macOS。...

    C++教程网

    实训主题:C++程序设计、C++面向对象、运算符号重载、模板、异常处理等。 实战项目:俄罗斯方块。 阶段六:大并发服务器设计 课程目标:综合应用Linux系统编程、Linux网络编程、C++所学的知识编写一个大并发服务器...

    杭州计算机软件行业C++应用软件开发工程师岗位介绍JD模板.docx

    模板是C++语言的一个重要特性,STL是C++标准模板库,网络编程和多线程编程是C++开发的重要应用领域。 4. Linux环境下的C++编译、链接和调试 Linux环境是C++开发的重要平台,开发工程师需要具备Linux环境下的C++...

    杭州计算机软件行业C++应用软件开发工程师岗位介绍JD模板.pdf

    * 精通模板、STL、网络编程、多线程编程,了解分布式、缓存、消息、异步等机制 * 精通 Linux 环境下的 C++编译、链接和调试 * 熟悉操作系统常用命令,可以部署系统与分析性能 * 精通面向对象设计方法和设计模式,...

    C++JIAOCHENG

    - 学习TCP/IP基础知识,深入socket编程,了解进程间通信机制(如消息队列、共享内存、信号量)以及多线程编程。最终实现一个小型FTP服务器miniftpd。 第五阶段:跟我一起学 C++ - 进入C++的世界,理解面向对象编程...

    linux C++ 服务器/后台开发 秋招整理资料

    2. **并发处理**:掌握多线程和多进程编程,理解同步与互斥机制,如锁(mutex、condition_variable)、信号量等。 3. **异步I/O**:了解异步I/O模型,如select、poll、epoll等,以及非阻塞I/O。 4. **高性能服务器...

    c++晋级经典资料

    C++11引入了线程库,包括线程、互斥锁、条件变量、原子操作等,这些工具使得多线程编程更加方便和安全。 ### 数据结构和算法 数据结构和算法是编程的基石。链表、栈、队列、树和图是常见的数据结构,它们提供了...

    数据结构 打印队列

    6. **多线程与并发**: - 在实际系统中,打印队列可能需要处理多个并发的打印请求。这可能涉及使用互斥锁(mutexes)和条件变量(condition variables)来保证线程安全。 7. **优先级队列**: - 如果需要根据...

    linuxc++编程指南

    10. **并发与多线程**:C++11及后续版本提供了内置的多线程支持。理解线程安全、同步机制如互斥锁、条件变量,以及线程池的概念。 11. **文件系统交互**:学习如何使用C++标准库中的`fstream`类进行文件操作,以及...

    Professional Linux Programming

    Linux编程不仅涉及C和C++语言,还涉及到系统调用、多线程、网络编程、文件I/O等关键领域。 一、Linux操作系统基础 Linux是开源的操作系统,基于Unix,以其稳定性和灵活性受到开发者青睐。在Linux编程中,理解操作...

    C++ Primer Plus 6th 2011(New C++11 Coverage)

    - **线程支持**:增加了多线程编程的支持,包括std::thread和其他线程安全的工具。 3. **标准模板库(STL)**:C++标准库中的一个重要组成部分,包含了大量通用算法和数据结构,如向量、列表、队列、栈等容器,以及...

    跨平台的C++日志库

    线程安全则表示即使在多线程环境中,日志库也能正确地同步对共享资源的访问,避免数据竞争和死锁等问题,确保程序的稳定性。 3. **回调机制**:回调机制允许用户自定义日志处理的逻辑。例如,用户可以注册一个回调...

    完全公平队列的实现

    总的来说,完全公平队列通过精细化的队列管理和公平的资源分配,为多进程环境下的磁盘I/O提供了高效且公平的服务。在C++中实现这样的调度算法,需要深入理解操作系统调度原理以及C++语言特性,以达到性能和灵活性的...

    消息处理引擎C++源码(11月8日版)

    4. **并发处理**:考虑到服务器的高并发需求,消息处理引擎可能采用了多线程或异步I/O模型,如Epoll,来并发处理多个消息,提高系统吞吐量。 5. **错误处理和异常安全**:在处理过程中,可能会遇到各种错误,如消息...

    C/C++/STL/數據結構/LINUXC編程實例

    这些实例可能涵盖了如文件操作、多线程编程、网络编程、信号处理、内存管理等多个方面,对于提升编程技能非常有帮助。 源码分析和实践是提高编程能力的有效方式,通过阅读和运行这些实例,你可以更深入地了解各种...

    C++写的跨平台BlockingQueue

    `std::mutex`确保了多线程环境下的数据一致性,而`std::condition_variable`则提供了条件等待和通知机制。 以下是一个基础的`BlockingQueue`实现框架: ```cpp #include #include #include template class ...

Global site tag (gtag.js) - Google Analytics