2010-11-07 77 views
2

是否存在,而在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不要被我的线程中。

+2

你的问题是什么?代码中的所有'i's都是局部变量。结果42证实了这一点。 – 2010-11-07 18:04:03

+0

恩,这个例子很糟糕...我明白了。我想我在线程1是1,在线程2是3,并保持那样...必须编辑。 – wishi 2010-11-07 18:09:07

+0

@Duck:你可以修改哪些代码?简单的解决方案是在本地声明第二个'i'。 – kennytm 2010-11-07 18:18:11

回答

3

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

2

示例代码错误(本身)并且具有未定义的行为。您正尝试读取四次未读初始化的变量t - 两次以在一个演员表达式中编入索引并两次 - 并根据&threads[t]的含义(未定义),函数pthread_create可能会导致更多的UB。

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

关于变量i:声明一个新的变量i(即int i = 0)在局部范围内的更广泛的范围内隐藏任何可能i的 - 所以不应该使用i本地AS内部的变量名的任何问题功能。

+0

+1很棒但我认为这不是一个真正的答案;) – 2010-11-07 18:19:37

5

GCC中,你可以做一个全局变量线程局部使用__thread符:

__thread int i = 42; 

不要那样做。有更好的解决方案,取决于你想要做的。

1

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