线程函数中的局部变量与线程局部变量相似吗?
假设我有下面的C代码片段,我的问题是线程函数中的变量CCD_;运行";类似于全局线程局部变量i
?这是否意味着对它们的修改都是线程安全的?
#include <threads.h>
#include <stdio.h>
thread_local int i = 10;
int run(void* v) {
int j = 10;
i = 0; // thread safe?
j = 0; // thread safe?
printf("%dn%d", i, j);
return thrd_success;
}
int main(void) {
#if !defined(__STDC_NO_THREADS__)
thrd_t thread;
thrd_create(&thread, run, NULL);
thrd_join(thread, NULL);
#endif
return 0;
}
我的问题是线程函数中的变量j是否;运行";类似于全局线程局部变量i?
取决于你所说的";类似";。
这是否意味着对它们的修改都是线程安全的?
是的,修改j
或i
是线程安全的1。
主要区别在于i
在线程的持续时间内是持久的(像全局的(,而j
只在run
运行时存在。
在您的程序中,run
的寿命和线程的寿命(几乎(相同,但构造一个i
的寿命比j
0长得多并且跨多个函数使用的示例并不重要。
1如果您将i
或j
的地址传递给另一个线程,那么它们本身都不是线程安全的,您需要同步访问,否则将出现数据竞争。