第二次进入 Computer后sum保留原来的值,
那么在多线程中调用Computer会是怎样的结果?
每个线程有独立的sum?还是同一个sum?
void Computer(){
static int sum;
}
14 个解决方案
#1
同一个
#2
不会定义多次~
#3
帮顶 同学习
#5
谢谢!看到这个链接中有这么一个回复,我试试:
#define ThreadSafe __declspec( thread )
static ThreadSafe unsigned int sequencenum = 0;
可以为每一个线程都单独创建一个全局变量。
windows的消息队列,也是每个线程有一个。
#6
只分配一个空间
#7
这个要用到“线程本地存储”(TLS)。
以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex
以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex
#8
请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建在TLS?
#9
同一个,
#10
函数调用就是一个过程的封装,很明显的是对于局部静态变量,是全局变量,唯一的,所以多线程环境是也是不变的,这个变量是共享同一个。
#11
恨死了这些全局变量、静态局部变量。
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。
自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。
自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……
#12
就是所谓的代码不可重入吧。
#13
_beginthreadex只负责处理C运行库中的静态变量。
如果要使用自己的线程变量,可以使用TLS系列API:
TlsAlloc
TlsFree
TlsGetValue
TlsFree
以上是动态TLS的使用接口。
__declspec(thread) int g_iSeq = 0;
这是静态TLS,使用起来更加方便。
更详细的描述可以参考《Windows核心编程》21章,线程局部存储区
#14
上面有行打错了
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
#1
同一个
#2
不会定义多次~
#3
帮顶 同学习
#4
#5
谢谢!看到这个链接中有这么一个回复,我试试:
#define ThreadSafe __declspec( thread )
static ThreadSafe unsigned int sequencenum = 0;
可以为每一个线程都单独创建一个全局变量。
windows的消息队列,也是每个线程有一个。
#6
只分配一个空间
#7
这个要用到“线程本地存储”(TLS)。
以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex
以前C运行库中的某些函数就用到了静态变量,为了支持多线程,现在的版本将对静态变量的引用修改成了一段提取TLS中变量的代码。相应的,对CreateThread的调用也要全部替换成_beginthreadex
#8
请问是说:
用_beginthreadex创建线程,每个线程会为会有单独的static,创建在TLS?
#9
同一个,
#10
函数调用就是一个过程的封装,很明显的是对于局部静态变量,是全局变量,唯一的,所以多线程环境是也是不变的,这个变量是共享同一个。
#11
恨死了这些全局变量、静态局部变量。
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。
自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……
如果一段代码使用了大量的全局、静态,然后老板让你修改成多线程的,如果这个代码特别长,那么郁闷去吧。
自己千万不要用。如果别人的代码用了,需要自己维护,那么先日他先人板板……
#12
就是所谓的代码不可重入吧。
#13
_beginthreadex只负责处理C运行库中的静态变量。
如果要使用自己的线程变量,可以使用TLS系列API:
TlsAlloc
TlsFree
TlsGetValue
TlsFree
以上是动态TLS的使用接口。
__declspec(thread) int g_iSeq = 0;
这是静态TLS,使用起来更加方便。
更详细的描述可以参考《Windows核心编程》21章,线程局部存储区
#14
上面有行打错了
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue