[Prev][Next][Index][Thread]
Re: Passing parameters to threads
In article
<Pine.GSO.3.96.1000413170453.4171D-100000@tardis.tardis.ed.ac.uk>, Hugh
Greene <q@tardis.ed.ac.uk> wrote:
> On Thu, 13 Apr 2000, Dustin Voss wrote:
> > What is the best practice to pass a parameter to a thread? The thread
> > function passed to make(<thread>) looks like it takes no parameters.
>
> That's correct, the thread function has to take no parameters; and,
> strictly speaking, you don't "pass parameters to" a thread, since it isn't
> called. But, to be helpful rather than pedantic [:)], what you do is use
> closures; i.e., you mention inside a "method ... end" a binding which
> occurs outside its scope ("further up").
Huh...closures...Never wudda thunk it. Thanks!
[not snipping for posterity's sake]
> So instead of
>
> make(<thread>,
> function: do-something-with /* how do I pass 'my-state'?! */ );
>
> you want to say
>
> let my-state = get-some-state();
> make(<thread>,
> function:
> method ()
> do-something-with(my-state)
> end);
>
> [And I'm opening myself up to pedantry, since I'm not sure I have the
> "function:" keyword right ;-)]
>
>
> Note that there's a real gotcha here if your state is closed over a
> thread-local variable. If you say
>
> define thread variable *my-state* = #f;
>
> // Later ...
> *my-state* := get-some-state();
> make(<thread>,
> function:
> method ()
> do-something-with(*my-state*)
> end);
>
> then do-something-with will be called with the value of *my-state* _in the
> new thread_, i.e., #f (or it might even be undefined, I can't remember)!
> The workaround is to make a new, non-thread-local binding to the value
> first, then "close over" that:
>
> define thread variable *my-state* = #f;
>
> // Later ...
> *my-state* := get-some-state();
> // This next binding isn't thread-local
> let non-thread-local-my-state = *my-state*;
> make(<thread>,
> function:
> method ()
> do-something-with(non-thread-local-my-state)
> end);
>
> This is a pretty evil gotcha -- I'm sure it popped up in code in FD, back
> when it was HD, and it took us a while to spot -- but it very nicely
> illustrates closures and how "bindings are like pointers/references" (in
> that we have thread-local *bindings*, not thread-local state).
>
> Hope that helps,
> Hugh
Follow-Ups:
References: