C语言调用pthread_create为何无法100%执行线程预期逻辑
问题根因
出现打印次数不稳定的核心原因是主线程未等待子线程执行完成就直接退出,触发整个进程终止,子线程被强制销毁,具体逻辑如下:
pthread_create是异步调用:函数返回仅代表内核已经完成子线程的创建、把它放进了CPU调度就绪队列,不代表子线程已经开始执行。子线程什么时候能拿到CPU时间片、能执行多少指令,完全由操作系统调度器决定,没有固定时序。- 代码流程里,主线程调用完
pthread_create后,立刻主动调用了一次sub_routine,执行完打印后直接走到return 0逻辑退出main函数。C语言中main函数return等价于调用exit终止整个进程,此时操作系统会回收进程所有资源,所有还在运行/还没开始运行的子线程都会被直接强制杀死,不会继续执行后续代码。 - 最终打印结果完全取决于调度时序:如果子线程在主线程退出前抢到CPU执行完了
printf,就能看到两行输出;如果主线程执行速度过快,子线程还没来得及运行到打印逻辑进程就已经退出,就只能看到一行输出。
修复方案
在main函数return前加入pthread_join(thread, NULL);即可,这个接口会阻塞主线程,直到对应子线程执行完毕才会继续往下走,此时就能100%稳定看到两次打印。
修复后的main函数参考:
int main(int argc, char **argv) { void *p; pthread_t thread; if (argc < 1) return (0); p = argv[1]; pthread_create(&thread, NULL, sub_routine, NULL); sub_routine(p); pthread_join(thread, NULL); // 等待子线程执行完成 return (0); }
补充说明:代码里的
if (argc < 1)判断是永远不会触发的,程序启动时argc最小值为1,第一个参数是程序自身的运行路径,这个逻辑不影响本次的异常现象。
内容的提问来源于stack exchange,提问作者Soufiane
相关产品推荐
相关产品推荐

