找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4218|回复: 1

关于JAWS的一些问题

[复制链接]
发表于 2011-3-17 11:40:28 | 显示全部楼层 |阅读模式
最近看了一下JAWS的代码,thread_per_request模式下:
  1. ...
  2.   for (;;)
  3.     {
  4.       if (this->acceptor_.accept (stream) == -1)
  5.         ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
  6.                            ACE_TEXT ("HTTP_Acceptor::accept")), -1);
  7.       Thread_Per_Request_Task *t;
  8.       // Pass grp_id as a constructor param instead of into open.
  9.       ACE_NEW_RETURN (t, Thread_Per_Request_Task (stream.get_handle (),
  10.                                                   this->tm_,
  11.                                                   grp_id,
  12.                                                   factory),
  13.                       -1);
  14.       if (t->open () != 0)
  15.         ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
  16.                            ACE_TEXT ("Thread_Per_Request_Task::open")),
  17.                           -1);
  18.       // Throttling is not allowing too many threads to run away.
  19.       // Should really use some sort of condition variable here.
  20.       if (!this->throttle_)
  21.         continue;
  22.       // This works because each task has only one thread.
  23.       while (this->tm_.num_tasks_in_group (grp_id) > this->threads_)
  24.         this->tm_.wait (&wait_time);
  25.     }
  26.     ...
复制代码
这种方式在多个并发请求的时候是否会丢失?


还有Synch_Thread_Pool_Task模式下:
  1. ...
  2.   for (;;)
  3.     {
  4.       ACE_SOCK_Stream stream;
  5.       // Lock in this accept.  When it returns, we have a connection.
  6.       if (this->acceptor_.accept (stream) == -1)        /// 这里其中第一个线程会等待accept,其余的等待锁,直到一个新的连接到来
  7.         ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("%p\n"),
  8.                            ACE_TEXT ("HTTP_Acceptor::accept")), -1);
  9.       ACE_Message_Block *mb = 0;                                       
  10.       ACE_NEW_RETURN (mb,  ACE_Message_Block (HTTP_Handler::MAX_REQUEST_SIZE + 1), -1);       
  11.       // Create an HTTP Handler to handle this request
  12.       HTTP_Handler *handler = this->factory_.create_http_handler ();
  13.       handler->open (stream.get_handle (), *mb);
  14.       // Handler is destroyed when the I/O puts the Handler into the
  15.       // done state.
  16.       mb->release ();
  17.       ACE_DEBUG ((LM_DEBUG,ACE_TEXT (" (%t) in Synch_Thread_Pool_Task::svc, recycling\n")));
  18.     }
  19. ...
复制代码
这边以线程池模式存在,而处理一个新连接时会为每个连接创建Handler,这里如果使用一个Handler Pool效果会不会更好些?
 楼主| 发表于 2011-3-19 19:02:58 | 显示全部楼层
后来经测试发现Reactor 模式 也会在并发连接的情况下,连接丢失,请问有谁知道怎么避免或改进这个问题吗?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 21:34 , Processed in 0.020696 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表