当前位置:  技术问答>linux和unix

线程之间如何实现缓冲机制

    来源: 互联网  发布时间:2016-03-28

    本文导语:  其实我发现进程间的消息队列挺好的,实现了消息缓冲机制! 现在我有个项目是在线程之间进行处理的,其中一个线程从网络接收数据,再转给另一个线程去处理 如果同时接收了很多数据时,那效率会变低,甚至会...

其实我发现进程间的消息队列挺好的,实现了消息缓冲机制!
现在我有个项目是在线程之间进行处理的,其中一个线程从网络接收数据,再转给另一个线程去处理
如果同时接收了很多数据时,那效率会变低,甚至会丢失数据
请问如何在线程之间实现消息缓冲的机制呢?

|

//cthread.h
#ifndef __CTHREAD_H__
#define __CTHREAD_H__

#include 
#include "base.h"

class CThread
{
public:
    CThread();
    virtual ~CThread();

    virtual int     Init();             //需重载
    virtual void*   Run();              //需重载
    int             Start();
    int             Stop();
    int             InsertMsg(void* msg);
    int             GetMsg(void*& msg);
    int             IsStop();
private:

public:
protected:
    pthread_t       m_iThreadID;        //线程ID
    int             m_iState;           //线程状态,为0退出,为1运行
    int             m_iStopFlag;        //是否已经停止
    pthread_mutex_t m_mutexMsg;
    pthread_cond_t  m_condMsg;
private:
    list m_lstMsg;
};


#endif



//cthread.cpp
#include "cthread.h"

void* ThreadRun(void* arg)
{
//    pthread_cleanup_push();
    CThread* pBase = (CThread*)arg;
    pBase->Run();
//    pthread_cleanup_pop;
    return NULL;
}


CThread::CThread()
{
    m_iThreadID = (pthread_t)-1;
    m_iState = 0;
    m_iStopFlag = 0;
    m_lstMsg.resize(0);

    pthread_mutex_init(&m_mutexMsg, NULL);
    pthread_cond_init(&m_condMsg, NULL);
}

CThread::~CThread()
{
    pthread_mutex_destroy(&m_mutexMsg);
    pthread_cond_destroy(&m_condMsg);
}

int CThread::Init()
{
    return 0;
}

int CThread::Start()
{
    int ret = -1;
    m_iState = 1;
    ret = pthread_create(&m_iThreadID, NULL, ThreadRun, this);
    if (ret != 0)
    {
        m_iState = 0;
        return -1;
    }
    else
    {
        return 0;
    }
}

void* CThread::Run()
{
    while (m_iState != 0)
    {
        usleep(1000);
    }
    m_iStopFlag = 1;

    return NULL;
}

int CThread::Stop()
{
    m_iState = 0;

    return 0;
}

int CThread::InsertMsg(void* msg)
{
    if (NULL == msg)
    {
        return -1;
    }

    pthread_mutex_lock(&m_mutexMsg);
    m_lstMsg.push_back(msg);
    pthread_cond_signal(&m_condMsg);
    pthread_mutex_unlock(&m_mutexMsg);

    return 0;
}

int CThread::GetMsg(void*& msg)
{
    pthread_mutex_lock(&m_mutexMsg);
    int ret = -1;
get:
    if (m_lstMsg.size() > 0)

    {
        msg = m_lstMsg.front();
        m_lstMsg.pop_front();
        ret = m_lstMsg.size();
    }
    else
    {
        struct timeval now;
        struct timespec timeout;
        gettimeofday(&now, NULL);
        timeout.tv_sec = now.tv_sec + 3;
        timeout.tv_nsec = 0;
        ret = pthread_cond_timedwait(&m_condMsg, &m_mutexMsg, &timeout);
        if(ret != ETIMEDOUT)
        {
            goto get;
        }
        else
        {
            ret = -1;
        }
    }

    pthread_mutex_unlock(&m_mutexMsg);
    return ret;
}

int CThread::IsStop()
{
    return m_iStopFlag;
}






    
 
 

您可能感兴趣的文章:

  • 请教: 两个线程对一个缓冲区写入与读出 ........在线等.....
  • 一个多线程的环形缓冲, 当写追上读时如何检测如何跨过去?
  • 使用多线程对循环缓冲区读写,出现段错误,期待大牛帮忙解决问题!
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • 请问单线程异步机制的优势在哪里?
  • 为什么linux没有在内核实现多线程机制‏
  • 请问STLPort的线程安全是指不用任何同步机制么
  • JAVA中有没有类似C中的select、poll机制的类包来实现线程并发控制
  • java多线程中的异常处理机制简析
  • 多个线程同时等待一个锁,获取锁的机制是什么??
  • Android多线程处理机制中的Handler使用介绍
  • Java 多线程同步 锁机制与synchronized深入解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java中多线程相关类Thread介绍
  • 一个进程创建了两个线程,如何使得当任何一个线程(比如线程a)结束时,同时也结束线程b,也就是使两个线程一起死掉,怎么办呢?
  • c#多线程更新窗口(winform)GUI的数据
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 关于线程的问题,什么样的线程不是active线程?
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 我的一个多线程服务里, 总是有一个线程莫名其妙的变成僵尸线程。
  • 能否通过线程id控制线程的状态?或是观察到线程的状态?
  • 如何在一个线程中启动另外一个线程,然后本线程就退出?
  • 我要设置一个线程的优先级, 这个属性结构并没有线程的id,它怎么知道是设置哪个线程呢?
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • gcc链接的库,分不分单线程版本的和多线程版本的?
  • 内核栈~ 内核线程 ~用户线程 之间关系 问题
  • 子线程的数据如何返回给主线程?
  • 如果父线程死掉 那么子线程会不会死掉呢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3