[Ace-users] [ace-users] Different Reactors for reading and writing

Steve Huston shuston at riverace.com
Wed Feb 6 12:03:49 CST 2008


Hi Gonzalo, good to hear from you.

>      ACE VERSION:
>          5.4.7

Oy... ;-)

>      HOST MACHINE and OPERATING SYSTEM:
>          Ubuntu linux 2.6.22 (7.10)
> ...
> This is more a question to enlighten my ignorance, than a 
> proper problem
> report... I have a single-threaded process that intends do do this:
> 
> 1. Have an ACE_Acceptor and an ACE_Connector.
> 
> 2. The ACE_Connector will connect to the ACE_Acceptor using
>    non-blocking IO (one thread). A Reader and Writer (both
>    inheriting from ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>)
>    will be created.
> 
> 3. There will be an ACE_Message_Queue<ACE_MT_SYNCH> on which 
> the Writer
>    will enqueue messages and from which Reader will dequeue
messages.
>    This will happen in random order.
> 
> The problem I am seeing is that if the Writer hits the queue high
> watermark, the call to enqueue() will simply block; this will not be
> good, since the Reader (running on the same thread) will never get
the
> chance to dequeue a message and make more space for the 
> Writer to go on.

Right, because you specified ACE_MT_SYNCH on the queue and the default
time argument is 0 (block).

> One solution for this could be to query whether the queue is_full()
> before trying to enqueue another message, but that just moves the
flow
> control issue somewhere else. Then I thought about maybe using two
> Reactors running on two separate threads, one for the 
> Acceptor / Reader
> and one for the Connector / Writer. My questions are:
> 
> 1. Is this the proper way to handle this situation? Is it correct to
>    assume that if I want the Acceptor / Reader to run on a separate
>    thread from the Connector / Writer, then I must have two separate
>    Reactors, one for each of them? If I am wrong and I could have a
>    single Reactor running on two threads, how would I set the
>    Reactor's owner?

You're mixing apples and oranges... If you really want one thread, you
should change the queue/svc_handler synch trait to ACE_NULL_SYNCH.
Then the enqueue will fail at high-water mark rather than block.

If you want more than one thread and/or multiple reactors, study the
options for this in C++NPv2 chapter 4.

> 2. Is it Ok to have more than one Reactor on a single program? Will
I
>    run into problems if I go this way?

You can do this.

> 3. Are there any other suggested ways to handle this use 
> case? Could the
>    TP_Reactor play any part in this?

If you want multiple threads driving events, that's a popular
approach. Check out C++NPv2 chapter 4 for all the options though.

Best regards,
-Steve

--
Steve Huston, Riverace Corporation
Want to take ACE training on YOUR schedule?
See http://www.riverace.com/training.htm




More information about the Ace-users mailing list