Re: C++ Threads, what's the status quo?
Le Chaud Lapin wrote:
Jeff Koftinoff wrote:
Here we go again. :)
Jeff, I do not mean to offend you, but this example is precisely the
reason I made the statements I made before.
my_label is a global variable. The copying operation is an active
operation possibly involving modification of state. There is a _gross_
difference in mentalities going on here.
There are two different points of views coming from two different
groups of programmers:
Group 1 says, "f takes a const & argument, and therefore does not
modify it, so technically, it is const, and therefore it should be
thread safe for read operations"
Group 2 says, "Not only do we think that it is presumptive to imply
that C++ should 'honor' 'read-only' access to global variables, we do
not recognize this point of view."
Note that I could take your example, make a large const global object
with 100 data members, all declared mutable, invoke some operations on
it from two threads and say, "Mon Dieu..!!!" my const global variable
with all those mutable members did not withstand simultaneous access by
multiple threads!!!
No one ever said that a const global object should be "thread safe".
Well, you have a good point there. I think the 'general mindset' of
thread programmers do not understand this. I'm happy that you do.
Now, the c++ standard does not restrict any standard libraries from
using global objects.
In previous incarnations of implementations of std containers, I have
seen the use of a "const static T def_value;" default constructed
object in the container definition. This, regardless of memory
inefficiencies, is perfectly cromulent behaviour as far as the c++
standard is concerned.
And in this case, a real crash that I had debugged, was in code like
this that used vector and did not knowingly use global variables:
#include <vector>
#include <string>
void thread1()
{
while( 1 )
{
std::vector<std::string> v1;
for( int i=0; i<1000; ++i )
{
v1.push_back( std::string( "oops" ) );
}
std::vector<std::string> v2( v1 );
}
}
void thread2()
{
while( 1 )
{
std::vector<std::string> v3;
for( int i=0; i<1000; ++i )
{
v3.push_back( std::string( "oopsagain" ) );
}
std::vector<std::string> v4( v3 );
}
}
No apparent global variables are used, but if any of the methods of
vector used for some reason needed to use their static T for anything,
the code crashes; and it is insidious as well, as it may run for a
while before crashing.
I write multithreaded code often, and this makes things very very
tricky - without the c++ standard giving me guarantees about
thread-safe behaviour of the standard library or even exceptions, I
can't use them, I must have my own implementations which are written
with thread safety in mind.
Of course, nowadays it is hard to find an STL that does this, but just
recently I got bitten by a pre-compiled gcc cross-compiler that did not
have the 'thread safe' option enabled, causing crashes during exception
handling. This was tricky to figure out as by definition, exceptions
don't occur often, and so even less often an exception would crash
badly instead of behind handled properly.
--jeffk++
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]