Subject: Re: [boost] review request for boost.context
From: Anthony Williams (anthony.ajw_at_[hidden])
Date: 2010-07-29 04:36:17
Oliver Kowalke <k-oli_at_[hidden]> writes:
> Am 28.07.2010 19:21, schrieb Hartmut Kaiser:
>>> The TIB is not changed (only the pointers pointing to the limit and base
>>> of the stack).
>> That will result in problems, I'm sure - at least as soon as you start
>> moving context's between threads.
> Could you describe a scenario which will trigger an error, please?
Anything that uses thread-local variables or fiber-local variables will
fail if you just run it on another thread or fiber. This can include C
runtime functions --- errno is typically thread-local, for example.
>>> AFAIK migrating Win32 Fibers between threads is not possible and cloning
>>> also not - but maybe I'm wrong in this point.
>> Moving Windows fibers between threads is definitely possible.
> Or do I have to use a special function form the Win32 API?
You need 3 fibers to move a fiber between threads:
Thread A is running Fiber 1. It switches to Fiber 2.
Thread B is running Fiber 3. It switches to Fiber 1.
Hey presto, fiber 1 has switched threads.
All is now well, provided code on Fiber 1 doesn't use thread-local
variables. Recent versions of the MSVC runtime use fiber-local variables
instead of thread-local ones, so standard C and C++ functions should be
OK, but e.g. boost::thread uses thread-local variables for things like
the thread ID, thread_specific_ptr variables and at_thread_exit
-- Author of C++ Concurrency in Action http://www.stdthread.co.uk/book/ just::thread C++0x thread library http://www.stdthread.co.uk Just Software Solutions Ltd http://www.justsoftwaresolutions.co.uk 15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK. Company No. 5478976
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk