使用Message_Queue的经典的“有界缓冲区”的ACE实现

原创 2006年05月26日 13:42:00

#include "ace/Message_Queue.h"
#include "ace/Thread_Manager.h"
#include "ace/Synch_Traits.h"

typedef ACE_Message_Queue<ACE_MT_SYNCH> MT_Message_Queue;

// Global thread manager.

static ACE_Thread_Manager thr_mgr;

static int producer (MT_Message_Queue *msg_queue)

{

 // Insert thread into thr_mgr.

 ACE_Thread_Control tc (&thr_mgr);

 char buf[BUFSIZ];

 for (int n; ; )

 {

  // Allocate a new message.

  ACE_Message_Block *mb = new ACE_Message_Block (BUFSIZ);

  n = read (0, mb->rd_ptr (), mb->size ());

  if (n <= 0)

  {

   // Shutdown message to the other

   // thread and exit.

   mb->length (0);

   msg_queue->enqueue_tail (mb);

  }


  // Send the message to the other thread.

  else

  {

   mb->wr_ptr (n);

   msg_queue->enqueue_tail (mb);

  }

 }

 // The destructor of Thread_Control removes

 // the exiting thread from the

 // Thread_Manager automatically.

 return 0;

}

static int consumer(MT_Message_Queue *msg_queue)

{

 ACE_Message_Block *mb = 0;

 // Insert thread into thr_mgr.

 ACE_Thread_Control tc (&thr_mgr);

 int result = 0;

 // Keep looping, reading a message out

 // of the queue, until we timeout or get a

 // message with a length == 0, which signals

 // us to quit.

 for (;;)

 {

  result = msg_queue->dequeue_head (mb);

  if (result == -1)

   return -1;

  int length = mb->length ();

  if (length > 0)

   ::write (1, mb->rd_ptr (), length);

  delete mb;

  if (length == 0)

   break;

 }


 // The destructor of Thread_Control removes

 // the exiting thread from the

 // Thread_Manager automatically.

 return 0;

}

int main (int argc, char *argv[])

{

 // Use the thread-safe instantiation

 // of Message_Queue.

 MT_Message_Queue msg_queue;


 thr_mgr.spawn (ACE_THR_FUNC (&producer),

  (void *) &msg_queue,

  THR_NEW_LWP | THR_DETACHED);

 thr_mgr.spawn (ACE_THR_FUNC (&consumer),

  (void *) &msg_queue,

  THR_NEW_LWP | THR_DETACHED);

 // Wait for producer/consumer threads to exit.

 thr_mgr.wait ();

 return 0;

}

有界缓冲区问题

考虑生产者-消费者问题(也称作有界缓冲区问题)。两个进程共享一个公共的固定大小的缓冲区。 其中的一个,生产者,将信息放入缓冲区;另一个,消费者,从缓冲区中取出信息(该问题也可被推 广到m个生产者,...
  • yxc135
  • yxc135
  • 2013年03月17日 20:17
  • 1576

使用有界队列的线程池使用DiscardOldestPolicy拒绝策略

如果使用无界队列很简单,开启核心线程数,多余的全部阻塞直到内存耗尽。 如果使用有界队列,要清楚工作流程: * 若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程, ...
  • matrix_google
  • matrix_google
  • 2016年12月02日 22:51
  • 592

多线程安全的有界队列

今天在公司因为业务需求用到java.util.concurrent并发包下的集合。自己做了一个简单的包装,造了一个简单的轮子。支持多线程安全的有界队列。涉及volatile,AtmicInteger等...
  • u010994169
  • u010994169
  • 2018年01月17日 12:14
  • 31

ACE前台框架的使用心得1—TABLE 表格的使用

1.html页面中定义table 其中的table(grid-table)代表的是表格;id为g...
  • ZJJ_xionghaizi
  • ZJJ_xionghaizi
  • 2016年12月19日 15:18
  • 2270

自定义线程池-有界队列

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue; i...
  • zhuximengbing
  • zhuximengbing
  • 2017年05月19日 14:00
  • 194

[C++] ACE书籍推荐

《ACE程序员指南:网络与系统编程的使用设计模式》(简称:APG)《C++网络编程:运用ACE和模式消除复杂性 卷1》(简称:C++NPv1)《C++网络编程:基于ACE和框架的系统化复用 卷2》(简...
  • u010216743
  • u010216743
  • 2017年09月02日 21:48
  • 141

ACE有界栈用法

ACE_Bound_Stack与标准库中stack用法比较#include void stack_test(){ //打印当前函数名称 ACE_DEBUG((LM_DEBUG,ACE_TEXT("%s...
  • maxcode
  • maxcode
  • 2009年02月25日 23:59
  • 450

ACE读写锁(写优先)测试及用法

在网络编程中多线程是一个必用一种技术,但是在初步学习多线程的时候很多人会遇到这样或那样的问题。多线程编程时,在有读线程和写线程并发的时候就需要读写锁了。ACE的读写锁机制完全可以解决这些问题。 AC...
  • zfk198687
  • zfk198687
  • 2012年08月17日 17:21
  • 1709

开源C++库:ACE及其安装使用

什么是ACE?     ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实...
  • zhu2695
  • zhu2695
  • 2016年05月02日 11:49
  • 3519

ACE中的TCP Socket编程

Tcp通信过程一般为如下步骤: 服务器绑定端口,等待客户端连接。 客户端通过服务器的ip和服务器绑定的端口连接服务器。 服务器和客户端通过网络建立一条数据通路,通过这条数据...
  • lishuo102
  • lishuo102
  • 2012年04月20日 09:37
  • 2619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Message_Queue的经典的“有界缓冲区”的ACE实现
举报原因:
原因补充:

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