2011-11-14 37 views
6

Tôi đang cố gắng tạo một máy chủ đồng bộ tcp. Chủ đề chính của tôi sẽ tạo ra lắng nghe một cổng, và một kết nối đến sẽ được xử lý bởi một luồng.Tăng Asio Multithreaded TCP Synchronous Server

Mã của tôi:

void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service) 
{ 
    io_service->run(); 
} 

void Application::server() 
{ 
     boost::shared_ptr<boost::asio::io_service> io(
      new boost::asio::io_service() 
      ); 
     boost::shared_ptr<boost::asio::io_service::work> work(
      new boost::asio::io_service::work(*io) 
      ); 
     // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR 
     boost::asio::ip::tcp::acceptor acceptor(*io); 
     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 2198); 
     acceptor.open(endpoint.protocol()); 
     acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); 
     acceptor.bind(endpoint); 
     acceptor.listen();    

     // pool of threads 
     boost::thread_group worker_threads; 
     for(int x = 0; x < 5; ++x) 
     { 
      worker_threads.create_thread(boost::bind(&WorkerThread, io)); 
     } 

     while(true) 
     { 
      boost::shared_ptr<boost::asio::ip::tcp::socket> socket(
       new boost::asio::ip::tcp::socket(*io) 
       ); 
      acceptor.accept(*socket); 
      processConnection(*socket); 
      socket->close(); 
     } 

     io->stop(); 
     worker_threads.join_all(); 

} 

void Application::processConnection(boost::asio::ip::tcp::socket & socket) 
{ 
    boost::asio::streambuf request_buffer; 
    std::istream request_stream(&request_buffer); 
    // repsonse buffer 
    boost::asio::streambuf response_buffer; 
    std::ostream response_stream(&response_buffer); 
    boost::asio::read_until(socket, request_buffer, "</message>"); 

    // process request_buffer into response_buffer 

    boost::asio::write(socket, response_buffer); 

} 

Sau đây đang làm việc với nhiều hơn một client kết nối đến máy chủ; Tuy nhiên, nó cũng hoạt động nếu tôi loại bỏ các hồ bơi của thread. Bất cứ ai có thể giải thích cho tôi tại sao đó là? Tôi thậm chí cần một loạt các chủ đề? Tuy nhiên,

Trả lời

6

tuy nhiên, nó cũng hoạt động nếu tôi xóa nhóm chủ đề. Bất cứ ai có thể giải thích cho tôi lý do tại sao? Tôi thậm chí cần một loạt các chủ đề?

Bạn không cần một nhóm chủ đề được cung cấp mã mẫu của bạn. Không cần để gọi io_service::run() trong ngữ cảnh của bạn, vui lòng xem documentation

Các run() khối chức năng cho đến khi tất cả các công việc đã hoàn thành và không có nhiều xử lý được cử, hoặc cho đến khi io_service đã dừng lại.

Bạn chưa thêm bất kỳ trình xử lý nào vào số io_service do đó không cần phải gọi run(). Nếu bạn sử dụng các phương pháp không đồng bộ như async_accept(), thì bạn sẽ cần phải run() số io_service.

+0

là có một tình huống mà tôi sẽ cần sử dụng run() trên một máy chủ đồng bộ? – Takashi

+0

@ Takashi-kun không có –

1

bạn có thể tìm thấy nó dễ dàng hơn để đọc mã của bạn nếu bạn typedef những thứ tăng

dụ

typedef boost::asio::ip::tcp::socket TSocket; 

này không trực tiếp giúp đỡ, nhưng nó sẽ giúp

Các vấn đề liên quan