c - 类型转换为 void pointer & back

标签 c multithreading casting

我有一个函数:

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 );

intvoid * 之间的转换是不安全的,因为转换不一定是可逆的。

您还必须确保 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/

相关文章:

java - 为什么Android使用Java概念而不是D语言或C或C++?但是 Chromium 网络浏览器是 C++ 的,它的匹配非常复杂

c# - 在C#中使用Async/Await时,程序退出时任务是否自动终止?

c# - 使用 NHibernate 重用线程的 session

c++ - 是否可以从 uint32 读取 s64 值?

c - return 使指针来自整数而不进行强制转换 - 但类型可以吗?

c++ - Linux 管道 : Capturing realtime output of ping via popen

c - g_hash_table_contains 返回意外值

c - 如何从 C 中的 char 函数返回字符串

c++ - 监控一个线程的状态

c++ - 获取STL vector C++的地址