保持并行线程局部变量
是否存在,而在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
不要被我的线程中。
全局变量总是在整个编译单元中可用(如果使用外部声明,甚至可以使用更多编译单元)。这与线程无关,它是C/C++的默认行为。推荐的解决方案是不使用全局变量 - 全局变量是邪恶的。如果您仍然需要使用全局变量,那么您可能需要为它们加前缀,例如g_i
。另一个解决方案是将你的线程函数放入另一个编译单元(c文件)。
示例代码错误(本身)并且具有未定义的行为。您正尝试读取四次未读初始化的变量t
- 两次以在一个演员表达式中编入索引并两次 - 并根据&threads[t]
的含义(未定义),函数pthread_create
可能会导致更多的UB。
此外,它显然不是您使用的代码,因为pthread_create
函数缺少关闭括号。
关于变量i
:声明一个新的变量i
(即int i = 0
)在局部范围内的更广泛的范围内隐藏任何可能i
的 - 所以不应该使用i
本地AS内部的变量名的任何问题功能。
+1很棒但我认为这不是一个真正的答案;) – 2010-11-07 18:19:37
GCC中,你可以做一个全局变量线程局部使用__thread
符:
__thread int i = 42;
不要那样做。有更好的解决方案,取决于你想要做的。
phtread具有线程本地存储的概念,gcc通过__thread
存储类为其提供了一个简单的接口。这些变量受到全局变量的所有问题的困扰,然后还有更多。但有时它们很方便,因为所有其他解决方案在上下文中都较差。
你的问题是什么?代码中的所有'i's都是局部变量。结果42证实了这一点。 – 2010-11-07 18:04:03
恩,这个例子很糟糕...我明白了。我想我在线程1是1,在线程2是3,并保持那样...必须编辑。 – wishi 2010-11-07 18:09:07
@Duck:你可以修改哪些代码?简单的解决方案是在本地声明第二个'i'。 – kennytm 2010-11-07 18:18:11