|
Boost Users : |
Subject: Re: [Boost-users] Multithreaded HTTP server
From: Oliver Seiler (oseiler_at_[hidden])
Date: 2009-07-23 19:20:28
I am not an asio expert by any means, though I've dabbled. YMMV.
On Wed, Jul 22, 2009 at 8:25 PM, Alex Black<alex_at_[hidden]> wrote:
> Does this code look ok? Specifically, does this look like a good way to
> have a fixed # of threads service requests, and have each thread
> asychronously write out the response to their client?
Seems like the right thing to do.
> In the code below, I left out HandleHttpRequest, and that function parses
> the request, does some work, and writes out the response 8kb at a type,
> using async_write.
>
> note: the threads don't wait until the previous async_write is done, they
> each just keep calling async_write until all their data is out. (but they
> are careful to make sure their buffers are around for long enough)
Based on what I've read here recently I understand that each
async_write is done in succession. This may make a difference on
systems with more cores, even if you aren't seeing any problems. So
you probably need a handler for the async_write that does successive
async_writes until everything is written.
> [...]
> void CBaseWebServer::StartAsync(int port)
> {
> [...]
> for ( int i = 0; i < numberOfThreads; i++ )
> {
> // Fire up a thread to run the IO service
> shared_ptr<thread> pThread = shared_ptr<thread>(new
> thread(bind(&CBaseWebServer::RunIoService, this, i)));
N threads entering this->RunIoService...
> [...]
> void CBaseWebServer::RunIoService(int threadId)
> {
> m_pPerThreadId.reset( new int(threadId) );
N threads resetting what appears to be a single shared pointer; I'm
assuming its a shared_ptr. The problem is that a shared_ptr *instance*
isn't thread-safe, so having N threads independently resetting and
assigning it is going to cause problems (the reference counting *is*
thread-safe, but each thread needs its own shared_ptr, each pointing
to the same thing).
Having said that, I don't see the purpose of the pointer anyway, as it
isn't used in the code sample.
Not sure about the error handling on accept errors; I might have it
call StartAccept from HandleAccept regardless of the error, though
there might be some errors I'd give up on.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net