Calling ev_async_send() from multiple threads.

Marek Denis marek at
Tue Jun 26 13:13:31 CEST 2012

On Tue, Jun 26, 2012 at 12:52:07PM +0200, Marc Lehmann wrote:
> On Tue, Jun 26, 2012 at 12:00:57PM +0200, Marek <marek at> wrote:
> > Here is that A_cb():
> > 
> > mutex.lock()
> >   while(!queue.empty()) {
> >     data = get_data_from_hared_queue();
> >     flow->B_notify(data);
> >   }
> > mutex.unlock();
> > 
> > 
> > and B_notify(data) will look like:
> > 
> > appropriate_queue = choose_queue_from_object();
> > appropriate_queue.add(data);
> > this->async_watcher.send(); (let's imagine it runs iterate_cb()
> > function)
> I assume there is some pthread_mutex_lock/unlock inside
> appropriate_queue.add.
> Then it looks fine to me.

Basically I operate within a "main thread" and some tasks are done 
within separated threads (they may last e.g. couple of minutes or even 
hours). However, I need to pass the "result" from the helper thread to the main one by using shared queue. 
Fetching the result is done in A_cb() callback and locking 
is justified there [I also assume that even though the async watcher is 
triggered from the "helper thread context", the callback will be 
launched within the main thread]. However, next steps, like B_notify() 
will work on objects/queues modified only within one (main) thread, so 
no locking is required here.

> I don't really know what iterate_cb is supposed to be, but ev_async_send
> is pretty simple and can be called at any time.
> It would probably be most efficient to call it outside your lock (as in
> Your example), but you can also call it inside your lock.

I don't really like that kind of debugging, but did simple "printf() 
debugging" and indeed, I first ended e.g. B_notify() function and started 
running iterate_cb() function which is an expected behaviour.

Anyway, thanks for your help and clarification!

Marek Denis 
[marek at]

More information about the libev mailing list