試試下面這段代碼的輸出是什麼?
#include <stdio.h>
#include <process.h>
#include <windows.h>
class foo
{
public:
foo()
{
printf( "before sleep\n" );
Sleep( 1000 );
printf( "after sleep\n" );
}
void test()
{
printf( "in test\n" );
}
};
foo* bar()
{
static foo a;
return &a;
}
unsigned __stdcall thread( void* )
{
foo* p = bar();
p->test();
return 0;
}
int _cdecl main( int argc, char** argv )
{
for( int i = 0; i < 10; ++i )
{
uintptr_t t = _beginthreadex( NULL, 0, thread, NULL, 0, NULL );
CloseHandle( (HANDLE)t );
}
Sleep( 5000 );
return 0;
}
不知道C/C++標准有什麼規定沒有, 但粗看起來好像是編譯器的問題呀。我用的是vc8,誰幫忙測測別的編譯器。
根據星星的建議,把輸出貼出來,如下:
before sleep
in test
in test
in test
in test
in test
in test
in test
in test
in test
after sleep
in test
這裡的問題是至少有10個中的9個線程沒有等對象初始化完成,就已經調用對象的方法了,這肯定是不對的。我大概看了一下反匯編的結果,實際上還可能出現構造函數被調用多次的情況。
要解決這個問題,在編譯器的層次上要容易一點。如果是在用戶程序的層次上,則麻煩的多,因為這類方法都會涉及到另一個靜態變量的初始化。