查看: 84|回复: 2

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

[复制链接]
发表于 2016-10-17 16:26:08 | 显示全部楼层 |阅读模式 来自 甘肃
试试下面这段代码的输出是什么?
#include
#include
#include
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
不知道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个线程没有等对象初始化完成,就已经调用对象的方法了,这肯定是不对的。我大概看了一下反汇编的结果,实际上还可能出现构造函数被调用多次的情况。
要解决这个问题,在编译器的层次上要容易一点。如果是在用户程序的层次上,则麻烦的多,因为这类方法都会涉及到另一个静态变量的初始化。
卓航论坛免责声明
Discuz X 最新常见问题解决方案 https://bbs.piaoxian.net/thread-77402-1-1.html (出处: 飘仙建站论坛)
回复

使用道具 举报

发表于 2016-10-18 12:58:02 | 显示全部楼层 来自 韩国
过来看看的
回复 支持 反对

使用道具 举报

发表于 2016-10-20 00:10:50 | 显示全部楼层 来自 香港
有道理。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部