快速业务通道

局部变量的作用域-多线程和函数里的静态变量

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

试试下面这段代码的输出是什么?

#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个线程没有等对象初始化完成,就已经调用对象的方法了,这肯定是不对的。我大概看了一下反汇编的结果,实际上还可能出现构造函数被调用多次的情况。

要解决这个问题,在编译器的层次上要容易一点。如果是在用户程序的层次上,则麻烦的多,因为这类方法都会涉及到另一个静态变量的初始化。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号