[pdg-group] Meeting
Xiong Ming
ming.xiong at vanderbilt.edu
Sat Mar 20 22:28:51 CST 2004
Great! Thanks, I'll definitely read the book. It's getting more
intersting now. And hope more guys will join our discussion ( the group
is getting smaller & smaller now), since this really get your something
to learn.
Thanks
Don Hinton wrote:
>Hi Ming:
>
>On Sat, 20 Mar 2004, Xiong Ming wrote:
>
>
>
>>Hi, Don:
>> Thanks! Your reply makes perfect sense to me. Would you mind if I
>>ask some further questions? I wouldn't let go the opporutnity to get
>> a little more in-depth on this issue, because you are soooo familiar
>>with this Active Object pattern, ;-). Please see below
>>
>>
>
>You're welcome...
>
><snip>
>
>
>
>>>Anyway, when MQ_Scheduler's ctor calls the Thread_Manager::spawn method,
>>>it passes the address of the svc_run function, and "this," a pointer to
>>>itself, as a void*. svc_run, then dynamic_cast's void *arg back to a
>>>MQ_Scheduler* and invokes dispach() on it.
>>>
>>>
>>>
>>Yes, the dispatch () method basiclly runs a for loop (in a separate
>>thread) that continuely iterate the Activation list to see if a certain
>>method request
>>is runnable. When the can_run () (or guard ()) of a method request
>>returns true, it will execute the request via its actual servant
>>(MQ_Servant).
>>
>>On the other hand, the client thread uses MQ_Proxy to respond to
>>request. As we know, MQ_Proxy maintains a pointer scheduler_ that points
>>to the instance of the MQ_Scheduler, which is now running the dispatch
>>() in a separate thread. When here comes a new request, e.g., get (),
>>the client thread will create a new method requst object and insert it
>>to the activation list by invoking scheduler_.enqueue (method_request).
>>Here comes a issue of concurrency. When we invoke scheduler_.enqueue (),
>>is it going to affect the running of dispatch (), considering the fact
>>that the two methods are running at the same time in separate threads
>>but are invoked on the same object? Or a better question is, will the
>>scheduler_.enqueue () in the client thread make a contact with dispatch
>>() in the seperate thread to sort of let dispatch () stop for a while to
>>process scheduler_.enqueue ()? This is kind of complex, if i didn't make
>>myself clear enough, you can think of it as a question like: Is it
>>possible for a object to process two methods simutaneously if the two
>>methods are running on different threads?
>>
>>
>
>Access to the internal list or queue must be synchronized, but that's
>sorta implicit in the design. The book mentions this on page 383 but
>doesn't go into detail. I think Doug's suggestion of looking at chapter 6
>in C++NPv2, the ACE_Task Framework (which implements the Active Object
>Pattern), would be a good idea, since it goes into detail about how to do
>this. You can also just look at the ACE_Task implementation, i.e,
>ACE_wrappers/ace/Task*.
>
>If you don't have access to C++NPv1 and C++NPv2, you can borrow mine...
>
>hth...
>don
>
>
>
More information about the pdg-group
mailing list