程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 局部變量的作用域-多線程和函數裡的靜態變量

局部變量的作用域-多線程和函數裡的靜態變量

編輯:關於C++

試試下面這段代碼的輸出是什麼?

#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個線程沒有等對象初始化完成,就已經調用對象的方法了,這肯定是不對的。我大概看了一下反匯編的結果,實際上還可能出現構造函數被調用多次的情況。

要解決這個問題,在編譯器的層次上要容易一點。如果是在用戶程序的層次上,則麻煩的多,因為這類方法都會涉及到另一個靜態變量的初始化。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved