多线程中的函数中的static变量问题。

时间:2021-07-06 19:24:59
如果在函数 Computer中的定义一个static变量sum,
第二次进入 Computer后sum保留原来的值,
那么在多线程中调用Computer会是怎样的结果?
每个线程有独立的sum?还是同一个sum?

void Computer(){

  static int sum;

}

14 个解决方案

#1


同一个

#2


不会定义多次~

#3


帮顶 同学习

#5


引用 4 楼 cczlp 的回复:
http://topic.csdn.net/u/20070802/11/f03032ba-f3b6-47dd-a433-941b87abd746.html


谢谢!看到这个链接中有这么一个回复,我试试:

#define   ThreadSafe       __declspec(   thread   ) 
static   ThreadSafe   unsigned   int   sequencenum   =   0;   
可以为每一个线程都单独创建一个全局变量。 

windows的消息队列,也是每个线程有一个。

#6


只分配一个空间

#7


这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex

#8


引用 7 楼 feng32tc 的回复:
这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex


请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建在TLS?

#9


同一个,

#10


函数调用就是一个过程的封装,很明显的是对于局部静态变量,是全局变量,唯一的,所以多线程环境是也是不变的,这个变量是共享同一个。

#11


恨死了这些全局变量、静态局部变量。
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。

自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……

#12


就是所谓的代码不可重入吧。

#13


引用 8 楼 hztj2005 的回复:
引用 7 楼 feng32tc 的回复:
这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex


请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建……


_beginthreadex只负责处理C运行库中的静态变量。

如果要使用自己的线程变量,可以使用TLS系列API:
TlsAlloc
TlsFree
TlsGetValue
TlsFree

以上是动态TLS的使用接口。

__declspec(thread) int g_iSeq = 0;

这是静态TLS,使用起来更加方便。

更详细的描述可以参考《Windows核心编程》21章,线程局部存储区

#14


上面有行打错了

TlsAlloc
TlsFree
TlsGetValue
TlsSetValue

#1


同一个

#2


不会定义多次~

#3


帮顶 同学习

#4


#5


引用 4 楼 cczlp 的回复:
http://topic.csdn.net/u/20070802/11/f03032ba-f3b6-47dd-a433-941b87abd746.html


谢谢!看到这个链接中有这么一个回复,我试试:

#define   ThreadSafe       __declspec(   thread   ) 
static   ThreadSafe   unsigned   int   sequencenum   =   0;   
可以为每一个线程都单独创建一个全局变量。 

windows的消息队列,也是每个线程有一个。

#6


只分配一个空间

#7


这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex

#8


引用 7 楼 feng32tc 的回复:
这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex


请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建在TLS?

#9


同一个,

#10


函数调用就是一个过程的封装,很明显的是对于局部静态变量,是全局变量,唯一的,所以多线程环境是也是不变的,这个变量是共享同一个。

#11


恨死了这些全局变量、静态局部变量。
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。

自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……

#12


就是所谓的代码不可重入吧。

#13


引用 8 楼 hztj2005 的回复:
引用 7 楼 feng32tc 的回复:
这个要用到“线程本地存储”(TLS)。

以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex


请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建……


_beginthreadex只负责处理C运行库中的静态变量。

如果要使用自己的线程变量,可以使用TLS系列API:
TlsAlloc
TlsFree
TlsGetValue
TlsFree

以上是动态TLS的使用接口。

__declspec(thread) int g_iSeq = 0;

这是静态TLS,使用起来更加方便。

更详细的描述可以参考《Windows核心编程》21章,线程局部存储区

#14


上面有行打错了

TlsAlloc
TlsFree
TlsGetValue
TlsSetValue