我有一个函数:
void *findPos(void *param)
{
int origPos=(int)param;
...
}
我称之为线程运行器:
pthread_create( &threadIdArray[i], NULL, findPos, (void *)i );
现在,通过这种方式,我将 origPos 的值作为类型转换的 void 指针参数,即。我。这感觉像是一个肮脏的黑客来绕过只允许将空指针传递给线程运行器函数的限制。
这可以用更简洁的方式完成吗?
编辑:
请注意,我在 i
for 循环中运行 pthread_create()
函数,因此将指针传递给 i 可能不是一个安全的选择。
最佳答案
当然:只需提供一个指向 int
的指针,这是 API 设计者的意图:
void *findPos(void *param)
{
int origPos=*(int *)param;
...
}
pthread_create( &threadIdArray[i], NULL, findPos, &i );
int
和void *
之间的转换是不安全的,因为转换不一定是可逆的。
您还必须确保 i
在线程开始执行时仍然有效(如果 i
具有自动存储持续时间,例如,如果调用函数也调用 pthread_join()
)。
在您的情况下(i
是循环变量),您应该在安全位置复制变量的值,例如通过 malloc()
在堆上或通过推送它以适当的生命周期放在堆栈上:
static int args[THREAD_COUNT];
for(int i = 0; i < THREAD_COUNT; ++i)
{
args[i] = i;
pthread_create(&threadIdArray[i], NULL, findPos, args + i);
}
关于c - 类型转换为 void pointer & back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811171/