保持pthreadvariables本地

在Linux GCC上使用pthread.h来保持线程函数的局部variables有一种方法:

 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函数中是否有一个参数创build新的线程并保持variables是本地的:

 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不在我的线程。

Solutions Collecting From Web of "保持pthreadvariables本地"

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

在gcc中,可以使用__thread说明符来创建一个全局变量线程本地:

 __thread int i = 42; 

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

示例代码是错误的(本身),并具有未定义的行为。 你试图读取一个未初始化的变量t四次 – 两次索引一个数组,两次在一个强制转换表达式中 – 并且根据( &threads[t]含义(undefined),函数pthread_create可能会导致更多的UB。

此外,它显然不是你使用的代码,因为pthread_create函数没有关闭括号。

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

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