GCC 4.6.3下pthread.h无法正常工作的技术求助
问题分析与修复方案
咱们来逐个拆解你代码里的问题,这些都是pthread编程里常见的新手坑:
1. 线程ID参数完全错误
pthread_create的第一个参数需要是指向合法pthread_t变量的指针,用来接收系统分配的线程ID。你现在把id硬赋值成(void *)1ul,这是一个无效的内存地址,调用pthread_create时直接会触发未定义行为(大概率程序崩溃)。
正确写法是声明一个pthread_t类型变量,传递它的地址:
pthread_t tid; int d = pthread_create(&tid, NULL, exe, NULL);
2. 循环逻辑完全无效
你的exe函数里循环条件是for(i = 0; i < 0; i++)——初始值i=0,条件却是i<0,这个循环从一开始就不会执行任何内容,自然看不到输出。你应该把终止条件改成合理的正数,比如i < 10;另外char类型在不同系统里可能是有符号/无符号,用来计数的话用int更稳妥:
for(int i = 0; i < 10; i++){ printf("子线程输出:%d\n", i); }
3. 线程函数缺少返回值
pthread要求线程回调函数必须返回void*类型的值,你的exe函数没有写return语句,这会导致未定义行为。哪怕不需要返回数据,也得明确返回NULL:
void *exe(){ int i; for(i = 0; i < 10; i++){ printf("子线程输出:%d\n", i); } return NULL; // 必须添加这一行 }
4. 主线程未等待子线程完成
主线程调用pthread_create后直接退出,会导致整个进程终止,子线程哪怕逻辑正常也会被强制终止。你需要用pthread_join来等待子线程执行完毕:
int main(){ pthread_t tid; int create_result = pthread_create(&tid, NULL, exe, NULL); // 最好加个错误判断,排查线程创建失败的情况 if(create_result != 0){ printf("线程创建失败,错误码:%d\n", create_result); return 1; } // 阻塞等待子线程执行完成 pthread_join(tid, NULL); printf("主线程执行完毕\n"); return 0; }
修复后的完整代码
#include <pthread.h> #include <stdio.h> void *exe(){ int i; for(i = 0; i < 10; i++){ printf("子线程输出:%d\n", i); } return NULL; } int main(){ pthread_t tid; int create_result = pthread_create(&tid, NULL, exe, NULL); if(create_result != 0){ printf("线程创建失败,错误码:%d\n", create_result); return 1; } pthread_join(tid, NULL); printf("主线程执行完毕\n"); return 0; }
编译的时候记得链接pthread库,GCC编译命令要加-pthread参数:
gcc your_code.c -o your_program -pthread
内容的提问来源于stack exchange,提问作者dthusian
相关产品推荐
相关产品推荐

