当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

多线程和函数里的静态变量[VC/C++编程]

赞助商链接



  本文“多线程和函数里的静态变量[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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

#include <stdio.h>
#include <process.h>
#include <windows.h>

class foo
{
public:
    foo()
    {
        printf( "before sleepn" );
        Sleep( 1000 );
        printf( "after sleepn" );
    }
    void test()
    {
        printf( "in testn" );
    }
};

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个线程没有等对象初始化完成,就已经调用对象的办法了,这必定是不对的.我大约看了一下反汇编的后果,实际上还大概呈现构造函数被调用多次的情形.

要办理这个问题,在编译器的层次上要简单一点.假如是在用户程序的层次上,则麻烦的多,因为这类办法城市触及到另一个静态变量的初始化.


  以上是“多线程和函数里的静态变量[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 多线程和函数里的静态变量
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .