W3C home > Mailing lists > Public > www-lib@w3.org > January to March 1998

Re: is libwww thread safe?

From: Erik Selberg <selberg@cs.washington.edu>
Date: Mon, 23 Mar 1998 17:29:27 -0500 (EST)
To: www-lib@w3.org
Message-ID: <rj7g1k9jb23.fsf@minbar.cs.washington.edu>
way back when, I did a pthreads implementation of libwww (on the old
4.x code base). 

Good news: this wasn't too hard; I basically just tossed around a
bunch of local locks on things.

Bad news: Performance bites. I mean, really, really bites. Like Mike
Tyson who hasn't eaten for days. 

At issue: libwww uses a asynchronous I/O based on the select() system
call. It's really not threads, all it is is the same stuff everyone
used back in the 70s to do routers and things like that. Just lots of
FSMs. :)

This is actually an amazingly efficient way to do things. What
happened when I put threads around it is that every SINGLE connection had
this HUGE amount of baggage. Select() is a pretty hefty call, and to
do it when there's only one connection outstanding is bad; to call one 
select() for every single connection is really bad. That's what the
threads ended up doing. Oops.

Also: just for fun, most OSes have a user thread limit, typically
around 512 or 1024. So, if you use one thread per connection, and you
do a lot of connections, you run out of threads _really_ quickly. You
also can't fork any processes while you're at the thread limit, which
brings everything to an ungraceful halt really quickly.

If you're able to do a thread-based implementation around the 
select() mechanism (say for a multiprocessor, where each processor
gets a thread), that would be way cool. But it's a harder issue,
because you need to have multiple select() calls doing stuff. However, 
the performance gains should be there.

Cheers,
-e
Received on Monday, 23 March 1998 17:30:40 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 23 April 2007 18:18:27 GMT