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

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

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

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

时间: 2025-01-02 01:06:06

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

python类和函数中使用静态变量的方法

  本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossible]的事, 但总有解决的办法,下面通过实现一个类或函数的累加器来介绍一些较为非主流的方法 方法一.通过类的__init__和__call__方法 ? 1 2 3 4 5 6 7 8 9 10 11 class foo: def __init__(self, n=0): self.n = n d

PHP引用操作以及外部操作函数的局部静态变量的方法

通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引用符才能保持地址操作 3. 函数返回值引用必须在函数申明时以及调用时都添加引用操作符 该例子使用的是对象方法的操作,同样适用于函数 <?php class A { public function & test1(& $a) { static $i = 0; var_dump($i); $

请教下vs2005里面可以像1.1版本一样在网页里用静态变量吗?

问题描述 如:全局设置网页标题网页代码:<title><%=SystemInfo.WebName%></title>类文件:classSystemInfo{publicstaticstringWebName="移动后台管理中心";}这样它怎么告诉我,不能编译,必须转为char类型??? 解决方案 解决方案二:可以啊解决方案三:classSystemInfo{publicstaticstringWebName="移动后台管理中心";

JavaScript作用域,匿名函数和闭包例子(1/3)

匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数  代码如下 复制代码 //普通函数 function box() { //函数名是 box return 'TT'; }   //匿名函数 function () { //匿名函数,会报错 return 'TT'; }   //通过表达式自我执行 (function box() {       //封装成表达式 alert('TT'); })();   //()表示执行函数,并且传参   //把匿名函数赋值给变量

算法-STC51单片机密码锁程序 为什么我的按键值存不进数组???main函数里的case后面得不出结果;

问题描述 STC51单片机密码锁程序 为什么我的按键值存不进数组???main函数里的case后面得不出结果: #include #include #define uchar unsigned char #define uint unsigned int sbit light=P2^5; uchar originalword[6]={1,2,3,4,5,6}; uchar currentword[6]; uchar newword[6]; bit pwflag; uchar count=0; b

以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?

问题描述 以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用? #include using namespace std; typedef struct Node { int age; struct Node* next; }LIST; void addList1(LIST* pHead,int x)//链表结尾加节点 { LIST* pM=new LIST();//新节点 pM->age=x; pM->next=NULL; if(pHead==NULL)

settimeout-javascript在函数中使用setTimeout变量的作用域问题

问题描述 javascript在函数中使用setTimeout变量的作用域问题 function test1(){ var n = 10; setTimeout("alert(n)", 500); } function test2(){ var n = 10; setTimeout(function(){alert(n)}, 500); } test1(); test2(); 上面的代码中,执行test1会报错,提示n没有定义,执行test2会把10打印出来. 上面两个函数区别在哪里?

函数指针 c语言 指针-C语言 在函数里给结构体赋值

问题描述 C语言 在函数里给结构体赋值 求懂的人解释一下,谢谢 代码意思是想在传结构体指针给函数,在函数里面改变结构体各项的值,运行结果为:a和b的值能改变,但到打印指针c的时候,程序报错 #include struct stu { int a; int b; char *c; }; //给结构体s1初始化 void Fun(void *ptr) { char *s = (char *)malloc(10); s = "Hello World"; int *p = (int *)ptr

vs2008中OnDraw函数里为什么把pdc注释掉

问题描述 vs2008中OnDraw函数里为什么把pdc注释掉 vs2008中OnDraw函数里为什么把pdc注释掉,如果是默认参数,在函数的声明中没有给参数赋初值呀 解决方案 不一定非得要给参数赋值啊,不赋值的话,那个参数是必须传入的参数