将pthread变量保持为本地

时间:2010-11-07 18:00:36

标签: c linux pthreads posix

在Linux GCC上使用pthread.h来保持线程函数本地变量是否有办法:

int i = 42; // global instance of i    

int main() {
    pthread_t threads[2];
    long t;
    pthread_create(&threads[t], NULL, ThreadFunction, (void *) t;
    pthread_create(&threads[t], NULL, ThreadFunction2, (void *) t;
}

我想知道POSIX函数是否有一个参数创建新线程并将变量保持为本地:

void *ThreadFunction(void *threadid)
{
    int i=0;
    i++; // this is a local instance of i
    printf("i is %d", i); // as expected: 1
}

void *ThreadFunction2(void *threadid)
{
    i += 3; // another local instance -> problem
}

之后i为42.即使我之前已定义i,我也希望此i不在我的帖子中。

4 个答案:

答案 0 :(得分:5)

在gcc中,您可以使用__thread说明符创建一个全局变量thread-local:

__thread int i = 42;

不要那样做。根据您的需要,有更好的解决方案。

答案 1 :(得分:3)

全局变量始终在整个编译单元中可用(如果使用外部声明,则甚至可以使用更多编译单元)。这与线程无关,它是C / C ++的默认行为。推荐的解决方案是不使用全局变量 - 全局变量是邪恶的。如果您仍然需要使用全局变量,则可能需要为它们添加前缀,例如g_i。另一个解决方案是将您的线程函数放入另一个编译单元(c文件)。

答案 2 :(得分:2)

示例代码错误(单独)并且具有未定义的行为。您试图读取未初始化的变量t四次 - 两次索引数组,两次读取一个强制转换表达式 - 并且取决于&threads[t]的(未定义)含义,函数{{1可能会导致更多的UB。

此外,它显然不是您使用的代码,因为pthread_create函数缺少右括号。

关于变量pthread_create:在本地范围内声明新变量i(即i)会在更广泛的范围内隐藏任何可能的int i = 0 - 所以在本地使用i作为函数内的变量名称应该没有任何问题。

答案 3 :(得分:1)

phtread具有线程本地存储的概念,gcc通过__thread存储类为其提供了一个简单的接口。这些变量受到全局变量的所有问题的困扰,然后还有更多。但有时它们很方便,因为所有其他解决方案在上下文中都更糟糕。