线程消息队列 示例

原创 2015年07月10日 17:13:44
#include<stdio.h>

#pragma once
#ifdef LINUX
#include <pthread.h>
#else


#endif

#define APP_OK 0
#define APP_FAIL -1


#define IN_QUEUE 1
#define OUT_QUEUE 0
#define MAX_QUEUE 256


typedef struct pmessage_
{
struct pmessage_ *next;
unsigned int msg[4];//message body
int is_in_queue;
}pmessage;


class Queuemessage
{
public:
int m_maxnum;//最大消息队列数目
int m_curnum;// 当前消息数目
pthread_mutex_t  m_mutex;
pthread_cond_t  m_condQueue;
pmessage *m_head;
pmessage *m_tail;
pmessage *m_messagebody[MAX_QUEUE];

public:
Queuemessage(void);
virtual ~Threadmessage(void);
int init_messgae(int queueNo);
pmessage* get_idle_body();//获取空闲的消息体
int insert_queue(pmessage *messgae);//入列
pmessage* push_queue();// 从头部出列
// int read_one_message();//从队列读出消息
// int write_one_message();//写一个消息体
int queue_isfull();//判断当前线程是否满
int queue_isempty();//消息队列是否空的
int pthread_sleep();//阻塞当前线程
int pthread_wakeup();//唤醒线程


};



Queuemessage::Queuemessage(void)
{
}


Queuemessage::~Queuemessage(void)

{

for(int i =0;i<m_maxnum;i++)

{

if(m_messagebody[i] != NULL)

{

free((void *)m_messagebody[i]);

}

}

}


int Queuemessage::init_messgae(int queueNo)
{
m_maxnum = MAX_QUEUE;
m_curnum = 0;
pthread_mutex_init(&m_mutex, NULL);
pthread_cond_init(&m_condQueue, NULL);
m_head = NULL;
m_tail = NULL;
for(int i = 0; i < m_maxnum;i++)
{
m_messagebody[i] = malloc(sizeof(pmessage));
if(m_messagebody[i] == NULL)
{
return APP_FAIL;
}
}


return APP_OK;
}
pmessage* Queuemessage::get_idle_body()
{
for(int i = 0; i < m_maxnum;i++)
{
if(m_messagebody[i]->is_in_queue == OUT_QUEUE)
{
return m_messagebody[i];
}
}


return NULL;
}


int Queuemessage::insert_queue(pmessage *messgae)//从尾巴入列
{
if(messgae == NULL)
{
return APP_FAIL;
}
pthread_mutex_lock(&m_mutex);


if(queue_isfull())
{
pthread_mutex_unlock(&m_mutex);
return APP_FAIL;
}


if(queue_isempty())
{
m_head = m_tail = messgae;
}
else
{
m_tail ->next = messgae;
m_tail = messgae;
}
m_tail ->next = NULL;
m_curnum += 1;
messgae->is_in_queue = IN_QUEUE;
pthread_wakeup();//有消息过来 则唤醒读取消息的线程
pthread_mutex_unlock(&m_mutex);


return APP_OK;
}




pmessage* Queuemessage::push_queue();// 从头部出列
{
AGAIN:
pthread_mutex_lock(&m_mutex);
if(queue_isempty())
{
pthread_sleep();//如果队列里没有消息阻塞线程
pthread_mutex_unlock(&m_mutex);
goto AGAIN;
}
pmessage *tmp = NULL;
*tmp = m_head;
if(m_head->next)
{
m_head = tmp->next;
}
else
{
m_head = m_tail = NULL;
}


m_curnum -= 1;
tmp->is_in_queue = OUT_QUEUE;
pthread_mutex_unlock(&m_mutex);


return tmp;


}


int Queuemessage::queue_isfull()
{
if(m_maxnum == m_curnum)
{
return APP_OK;
}


return APP_FAIL;


}


int Queuemessage::queue_isempty()
{
if(m_curnum == 0)
{
return APP_OK;
}
return APP_FAIL;
}




int Queuemessage::pthread_sleep()//阻塞当前线程
{
pthread_cond_wait(&m_condQueue, &m_mutex);
return APP_OK;
}


int Queuemessage::pthread_wakeup()//唤醒线程
{
pthread_cond_broadcast(&m_condQueue);
return APP_OK;
}

Windows消息响应机制之三:线程与消息队列

当一个线程第一次被创建时,系统假定线程不会用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦该线程调用一个与图形用户界面有关的函数 ( 如检查它的消息队列或建立一个窗口 ),系统就...
  • aafengyuan
  • aafengyuan
  • 2013年01月07日 15:46
  • 2983

MFC多线程——线程与消息队列

1、创建和终止线程   在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。   工作者线程 ...
  • andy5zhu
  • andy5zhu
  • 2013年12月14日 18:51
  • 1649

java线程池和消息队列的运行流程分析

1.通过以下代码,向线程池中不断的放入线程任务 public static void main(String[] args) { for(int i=0;i...
  • y41992910
  • y41992910
  • 2017年05月13日 22:17
  • 499

采用线程池和消息队列的“伪异步”I/O模型

参考:《Netty权威指南》 由于 一请求一线程 的I/O模型,在高并发时创建大量的线程,严重降低系统性能,并且容易造成线程堆栈溢出等问题。 采用线程池和消息队列的“伪异步”模型,是一种改...
  • hbtj_1216
  • hbtj_1216
  • 2016年11月10日 20:16
  • 1266

菜鸟来解释线程中的循环者Looper读取消息队列

安卓中的Looper使用就是用来给线程创建一个循环,类似while或for循环等。
  • dreamInTheWorld
  • dreamInTheWorld
  • 2015年01月19日 19:53
  • 1339

linux下多线程间通信之信号量,消息队列的综合运用

一、消息队列介绍 消息队列是消息的链接表,存放在内核中。其实质上就是一个内核链表,消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。Linux用宏MSGMAX和MSGMNB来限制...
  • GQ1900
  • GQ1900
  • 2016年04月05日 10:10
  • 2187

C#线程类框架,支持消息队列,通过postmessage从UI线程发送消息到工作者线程

C#,封装Thread类,直接通过postmessage向线程发送消息,支持线程暂停,恢复,结束与终止,自己跟着感觉写的,不造有没有啥致命的毛病...
  • sudoRoger
  • sudoRoger
  • 2017年01月15日 21:33
  • 868

多线程消息队列框架的设计(很好很实用的设计思想)

多线程消息队列有广泛的应用场合。任何程序都是为了完成某个业务活动。有时候业务活动的发起者只知道要完成某个业务活动,而不知道或者不关心这个业务活动何时完成以及如何完成;有时候业务活动的实际处理者只知道如...
  • hktkfly6
  • hktkfly6
  • 2014年05月04日 23:44
  • 1485

Python中的多线程threading和线程间消息队列queue学习笔记

python中实现多线程可以通过threading类。线程间同步则可以用queue类。至于python的进程间通信,暂时没有发现有类似linux ipc的模块可供使用,但是可以通过unix域套接字实现...
  • l1902090
  • l1902090
  • 2014年04月30日 17:15
  • 9796

基于Linux的消息队列及多线程编程实现的聊天室(一)

本程序主要是针对Linux IPC通信初学者对Linux下消息队列通信机制,多线程编程,字符串处理,链表操作,信号简单处理等基本概念的练习。原理:  消息队列是System V支持一种IPC机制,通过...
  • mr_raptor
  • mr_raptor
  • 2013年01月09日 11:18
  • 10636
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程消息队列 示例
举报原因:
原因补充:

(最多只允许输入30个字)