想象一下:
int foo(void* arg) {
int v = *(int*)arg; // is arg a potential dangling pointer here?
}
thrd_t t;
int bar() {
int my_variable = 42;
int ret = thrd_create(&t,foo,&my_variable);
return ret;
}
这里的执行顺序是什么?由于
foo
在不同的线程上运行,并且我们实际上并不等待线程完成/加入 - 但 thrd_create 返回 - arg
是一个潜在的悬空指针吗?
在这种情况下,可能是一个悬空指针...这取决于线程是否在
bar
函数返回之前运行并复制值(my_variable
的生命周期结束)。所以你所面临的是数据竞赛。
如果您只想传递值,更好的IDE是使用一些显式转换将值本身作为值传递:
thrd_create(..., (void *) (intptr_t) my_variable);
还有
int foo(void *arg)
{
int value = (int) (intptr_t) arg;
// ...
}