laja 发表于 2011-3-17 11:40:28

关于JAWS的一些问题

最近看了一下JAWS的代码,thread_per_request模式下:
...
for (;;)
    {
      if (this->acceptor_.accept (stream) == -1)
      ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                           ACE_TEXT ("HTTP_Acceptor::accept")), -1);

      Thread_Per_Request_Task *t;
      // Pass grp_id as a constructor param instead of into open.
      ACE_NEW_RETURN (t, Thread_Per_Request_Task (stream.get_handle (),
                                                this->tm_,
                                                grp_id,
                                                factory),
                      -1);


      if (t->open () != 0)
      ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                           ACE_TEXT ("Thread_Per_Request_Task::open")),
                        -1);

      // Throttling is not allowing too many threads to run away.
      // Should really use some sort of condition variable here.
      if (!this->throttle_)
      continue;

      // This works because each task has only one thread.
      while (this->tm_.num_tasks_in_group (grp_id) > this->threads_)
      this->tm_.wait (&wait_time);
    }
    ...
这种方式在多个并发请求的时候是否会丢失?


还有Synch_Thread_Pool_Task模式下:
...
for (;;)
    {
      ACE_SOCK_Stream stream;
      // Lock in this accept.When it returns, we have a connection.
      if (this->acceptor_.accept (stream) == -1)        /// 这里其中第一个线程会等待accept,其余的等待锁,直到一个新的连接到来
      ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("%p\n"),
                           ACE_TEXT ("HTTP_Acceptor::accept")), -1);

      ACE_Message_Block *mb = 0;                                       
      ACE_NEW_RETURN (mb,ACE_Message_Block (HTTP_Handler::MAX_REQUEST_SIZE + 1), -1);       

      // Create an HTTP Handler to handle this request
      HTTP_Handler *handler = this->factory_.create_http_handler ();
      handler->open (stream.get_handle (), *mb);

      // Handler is destroyed when the I/O puts the Handler into the
      // done state.
      mb->release ();
      ACE_DEBUG ((LM_DEBUG,ACE_TEXT (" (%t) in Synch_Thread_Pool_Task::svc, recycling\n")));
    }
...
这边以线程池模式存在,而处理一个新连接时会为每个连接创建Handler,这里如果使用一个Handler Pool效果会不会更好些?

laja 发表于 2011-3-19 19:02:58

后来经测试发现Reactor 模式 也会在并发连接的情况下,连接丢失,请问有谁知道怎么避免或改进这个问题吗?
页: [1]
查看完整版本: 关于JAWS的一些问题