线程的互函数

mutual function for threads

当我创建两个具有相同函数的线程时,函数中的静态变量是共享的?他们在哪里保存?因为如果它们保存在主线程的静态数据中,它们将被两个线程共享。

代码示例:

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;
}

每个线程都会 运行 一个不同的 'instance' 函数,所以不,它们不会使用完全相同的变量 'a'。

再次编辑:如果您在函数中声明 int a 线程是 运行,那么每个线程都会有它的不同副本。每个线程都有自己的堆栈,这就是它应该去的地方。

此外,我不确定您是否理解静态变量(也许您指的是静态局部变量)是什么意思。查看 this post

我也是多线程的新手,我发现你的问题很有趣。 搜索了一下后,我发现了以下内容:

我知道我的参考资料可能不是最好的参考资料(...维基百科),但它们确实提供了一些您可能会觉得有用的信息。

引用维基百科:“线程本地存储 (TLS) 是一种计算机编程方法,它使用 thread.This 本地的静态或全局内存,有时需要,因为通常进程中的所有线程共享相同的地址 space,这有时是不可取的。换句话说,静态或全局变量中的数据通常总是位于相同的内存位置,当它们被同一进程的线程引用时。然而,调用堆栈上的变量是局部的线程,因为每个线程都有自己的堆栈,驻留在不同的内存位置。"

所以说通常线程共享静态变量。所以 我假设 静态变量与静态变量位于不超过一个线程的进程中的位置完全相同。我当然可能是错的:-)

此外,如果您查看下面我的 GCC 参考资料,您可能会发现您可以使用 TLS 线程特定的静态变量。

希望我的回答对您有所帮助。

祝你好运!

参考文献:Wikipedia and GCC