当我创建两个具有相同功能的线程时,函数中的静态变量是共享的吗?他们在哪里得救了?因为如果它们保存在主线程的静态数据中,它们将被共享给两个线程。
代码示例:
void fill_g_msg( void ){
pthread_t t1, t2;
pthread_create(&t1, NULL, thread_fill, “first");
pthread_create(&t2, NULL, thread_fill, “second");
// wait for both threads to finish
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
void* thread_fill(void *arg){
int a;
if( strcmp((char*)arg, “second”) == 0 ) {
a = 1;
} else {
a = 2;
}
return null;
}
答案 0 :(得分:1)
每个线程都将运行函数的不同“实例”,所以不会,它们不会使用完全相同的变量'a'。
再次编辑:如果在线程正在运行的函数中声明int a,则每个线程将具有不同的副本。每个线程都有自己的堆栈,这应该是它应该去的地方。
另外,当你说静态变量时,我不确定你理解你的意思(也许你的意思是静态本地)。查看this post。
答案 1 :(得分:1)
我也是多线程的新手,我发现你的问题非常有趣。 在搜索了一下后,我找到了以下内容:
我理解我的引用可能不是最好的(...维基百科),但它们确实有一些你可能会觉得有用的信息。
引用维基百科:“线程局部存储(TLS)是一种计算机编程方法,它使用线程本地的静态或全局内存。这有时是必需的,因为通常进程中的所有线程共享相同的地址空间,有时候换句话说,静态或全局变量中的数据通常总是位于相同的内存位置,当来自同一进程的线程引用时。调用堆栈上的变量然后是线程的本地变量,因为每个线程都有自己的变量。堆栈,驻留在不同的内存位置。“
所以它说通常线程共享静态变量。所以我假设静态变量完全位于静态变量位于没有多个线程的进程中的相同位置。我当然可能错了: - )
此外,如果您查看下面的GCC参考,您可能会发现您可以使用TLS特定于线程的静态变量。
我希望这个答案对你有用。
祝你好运!