如何从pthread_create传递的void指针中获取可用于switch的整型值
问题核心原因
你当前的类型转换逻辑存在根本性错误:&opt取的是routine函数形参opt自身的栈内存地址,既不是你传入的num1的地址,也不是num1的存储值,自然无法得到正确结果。
修正方案(匹配你当前传参逻辑)
你调用pthread_create时传递的是num1变量的地址&num1,routine的形参opt存储的就是这个地址,需要先做指针类型转换再解引用取值,修正后的代码如下:
void* routine(void* opt) { // 先将void*转为intptr_t类型指针,再解引用获取原num1的值 long int n = *(intptr_t*)opt; switch(n) { case 0: printf("Test 0 from threads\n"); break; case 1: printf("Test 1 from threads\n"); break; }; sleep(3); printf("Ending thread...\n"); return NULL; }
注意:该方案需要保证线程执行取值时,原作用域的num1变量未被销毁,避免出现野指针问题
更稳妥的简化方案(传值无需考虑生命周期)
如果只是传递整数类的小参数,可以直接把值强制转为void*传递,不需要传地址,省去解引用步骤也没有野指针风险:
- 调整
pthread_create调用逻辑:
intptr_t num1 = 0; // 直接把值转为void*传递,无需取地址 pthread_create(&t1, NULL, &routine, (void*)num1);
- 调整
routine内的转换逻辑:
long int n = (long int)opt;
内容的提问来源于stack exchange,提问作者marti
相关产品推荐
相关产品推荐

