Dave Abrahams said: > On Thursday, February 06, 2003 12:33 PM [GMT+1=CET], > William E. Kempf <[EMAIL PROTECTED]> wrote: > >> Dave Abrahams said: >> >> > > Hmm... that would be >> > > an interesting alternative implementation. I'm not sure it's as >> "obvious" as the syntax I suggested >> > >> > Sorry, IMO there's nothing "obvious" about your syntax. It looks >> cumbersome and low-level to me. Let me suggest some other syntaxes >> for async_result, though: >> > >> > async_call<double> later(foo, a, b, c) >> > >> > or, if you don't want to duplicate the multi-arg treatment of >> bind(), just: >> > >> > async_call<double> later(bind(foo, a, b, c)); >> > ... >> > ... >> > double d = later(); // call it to get the result out. >> >> The two things that come to mind for me with this suggestion are: >> >> 1) You've explicitly tied the result into the call. I chose the other >> design because the result is just that, only a result. > > Hm? How is the result not a result in my case?
I didn't say it wasn't a result, I said that it wasn't "only" a result. In your case it's also the call. >> An asynchronous call can be bound to this result more than once. > > ...and if it can't be default-constructed? That's what boost::optional<> is for ;). >> 2) You're still hiding the thread creation. > > Absolutely. High-level vs. low-level. But I think too high-level. I say this, because it ties you solely to thread creation for asynchronous calls. >> This is a mistake to me for >> two reasons. First, it's not as obvious that a thread is being >> created here (though the new names help a lot). > > Unimportant, IMO. Who cares how an async_call is implemented under the > covers? I care, because of what comes next ;). >> Second, and this is more >> important, you've bound this concept to boost::thread explicitly. >> With the fully seperated concerns of my proposal, async_result can be >> used with other asynchronous call mechanisms, such as the coming >> boost::thread_pool. >> >> asyc_result<double> res1, res2; >> thread_pool pool; >> pool.dispatch(bind(res1.call(foo), a, b, c)); >> pool.dispatch(bind(res2.call(foo), d, e, f)); >> d = res1.value() + res2.value(); > > This one is important. However, there are other ways to deal with this. > An async_call object could take an optional thread-creation parameter, > for example. It's not "thread-creation" in this case. You don't create threads when you use a thread_pool. And there's other examples as well, such as RPC mechanisms. And personally, I find passing such a "creation parameter" to be turning the design inside out. It might make things a little simpler for the default case, but it complicates usage for all the other cases. With the design I presented every usage is treated the same. More importantly, if you really don't like the syntax of my design, it at least allows you to *trivially* implement your design. Sometimes there's something to be said for being "lower level". >> > That's what we mean by the terms "high-level" and "encapsulation" >> ;-) >> >> Yes, but encapsulation shouldn't hide the implementation to the point >> that users aren't aware of what the operations actually are. ;) > > I don't think I agree with you, if you mean that the implementation > should be apparent from looking at the usage. Implementation details > that must be revealed should be shown in the documentation. I was referring to the fact that you have no idea if the "async call" is being done via a thread, a thread_pool, an RPC mechanism, a simple message queue, etc. Sometimes you don't care, but often you do. -- William E. Kempf [EMAIL PROTECTED] _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost