Re: Threads - When?
Gerhard Menzl wrote:
Le Chaud Lapin wrote:
If you believe, as it seems to be the case, that a library built on OS
primitives is all it takes to make any C++ program thread-safe, then
please consider:
struct A { A(); };
void f()
{
static A a;
}
and explain how you would prevent the variable a from being constructed
more than once, using library calls only, and without any thread-related
guarantees by the language.
Hi Gerhard,
I was hoping for this example. This is one of the cases where the C++
standards bodies should have been well aware of the consequences. I
remember reading that the initialization of a is done once, and only
once, and thinking, "Ok, but...surely they know the consequences of
making that guarantee." Furthermore, there is an issue that is
actually unrelated to multi-threading here: the compiler has to make
sure there is a way to know if the a has already been initialized
(extra variable).
So yes, to answer you question, this is one of the examples were a race
condition, on principle, can occur. But I place this in the "Warning:
This is not a recursive function category." Note that, even if you
were guaranteed that the a were somehow magically initialized once, you
will still have the problem where it is a global variable in disguise.
Multiple threads would still have to work against this single,
fundamentally global, variable.
My position:
Given that there is really only one variable for multiple threads, and
that, if the function is expected to operate against that global
variable, then multiple initializations is only one problem - there
remains the problem of mutual exclusion.
Redesign the code, make the variable global (just outside the function,
if necessary), and put a mutex on it.
-Le Chaud Lapin-
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]