使用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;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Queue队列实现---有界队列BQueue

/* * @(#)BQueue.java */ package ds.util; import java.util.NoSuchElementException; /** * Thi...

有界缓冲区问题

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

使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存

JDK5.0之前,用java实现生产者和消费者的唯一方式就是使用synchronized内置锁和wait/notify条件通知机制。JDK5.0之后提供了显示锁Lock和条件队列Condition,与...

Muduo库源码分析(6):有界缓冲区,无界缓冲区

缓冲区的实现 类似于生产者消费者模型,往缓冲区添加任务相当于生产者,从缓冲区提取任务相当于消费者,Muduo库使用条件变量加互斥锁实现的有界和无界缓冲区 简易的条件变量加互斥锁实现的生产者消费者模...

ACE_Message_Block实现浅析

ACE_Message_Block实现浅析 1.     概述 ACE_Message_Block是ACE中很重要的一个类,和ACE框架中的重要模式的实现 如ACE_Reactor, ACE_Pr...

ACE_Message_Block的使用注意事项

记录ACE_Message_Block使用的一些注意事项。
  • DLite
  • DLite
  • 2011-02-12 10:07
  • 2420

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

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

moonmq: 用go实现的高性能message queue

介绍 moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务。 在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思...

消息队列(Message Queue)简介及其使用

利用MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防...

消息队列(Message Queue)简介及其使用

摘要:利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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