[Libevent-users] new member

Steven Grimm sgrimm at facebook.com
Fri Jan 12 10:16:30 EST 2007


As the guy who added thread support to memcached, I feel qualified to 
answer this one:

What libevent doesn't support is sharing a libevent instance across 
threads. It works just fine to use libevent in a multithreaded process 
where only one thread is making libevent calls.

What also works, and this is what I did in memcached, is to use multiple 
instances of libevent. Each call to event_init() will give you back an 
"event base," which you can think of as a handle to a libevent instance. 
(That's documented in the current manual page, but NOT in the older 
manpage on the libevent home page.) You can have multiple threads each 
with its own event base and everything works fine, though you probably 
don't want to install signal handlers on more than one thread.

In the case of memcached, I allocate one event base per thread at 
startup time. One thread handles the TCP listen socket; when a new 
request comes in, it calls accept() then hands the file descriptor to 
another thread to handle from that point on -- that is, each client is 
bound to a particular thread. All you have to do is call 
event_base_set() after you call event_set() and before you call event_add().

Unfortunately, you pretty much have to use pipe() to communicate between 
libevent threads, That's a limitation, and honestly it's a pretty big 
one: it makes a master/worker thread architecture, where one thread 
handles all the I/O, much less efficient than you'd like. My initial 
implementation in memcached used an architecture like that and it chewed 
lots of CPU time. That's not really libevent's fault -- no UNIX-ish 
system I'm aware of has an equivalent to the Windows 
WaitForMultipleObjects API that allows you to wake up on semaphores / 
condition variables and on input from the network. Without that, any 
solution is going to end up using pipes (or maybe signals, which have 
their own set of issues in a multithreaded context) to wake up the 
libevent threads.

-Steve


Glen Hein wrote:
>
> Hello,
>
>  
>
> I am doing research for a project that may follow an event-driven 
> multi-threaded model with heavy disk and network I/O.  The platform 
> will be FreeBSD and Linux.  Overall, we are seeking a C10K solution. 
>
>  
>
> I started reading through the libevent source and noticed several 
> comments about not being thread-safe.  However, I have seen references 
> to other projects that are multi-threaded and use libevent.  I need to 
> explore libevent and determine if it is viable for my project.  Have 
> there been discussions on threading issues in the mailing list 
> archive?  Is there another source of information on threads and 
> libevent? 
>
>  
>
> Thanks,
>
> Glen Hein
>
>  
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Libevent-users mailing list
> Libevent-users at monkey.org
> http://monkey.org/mailman/listinfo/libevent-users
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://monkeymail.org/archives/libevent-users/attachments/20070112/b47dc0bf/attachment.htm


More information about the Libevent-users mailing list