在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
不在我的帖子中。
答案 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
存储类为其提供了一个简单的接口。这些变量受到全局变量的所有问题的困扰,然后还有更多。但有时它们很方便,因为所有其他解决方案在上下文中都更糟糕。