C语言用pthread线程实现简易计算器时pthread_create报错如何解决
问题解答
错误产生原因
pthread_create第三个参数要求传入线程入口函数的指针,类型规范为void *(*)(void *),即返回值为void*、仅接收1个void*类型参数的函数指针。- 你的代码中直接写
add(calc)、sub(calc)是当场执行对应函数,将函数的返回值(void*类型)传入了第三个参数,类型完全不匹配,因此触发类型兼容报错。 - 补充说明:该写法会导致运算逻辑直接在主线程执行,完全没有实现子线程运行运算的预期效果。
修复方案
核心修改点
- 调整
pthread_create传参逻辑:第三个参数仅传入函数名(即函数本身的指针),需要传递给线程的参数calc放到第四个参数位传入。 - 新增
pthread_join调用,等待所有子线程执行完成后再退出主线程,否则主线程提前结束会直接终止进程,子线程来不及执行运算逻辑。 - 重命名自定义的
div函数,避免和C标准库的同名函数产生冲突,可改为my_div。 - 新增
malloc内存的释放逻辑,避免内存泄漏。
修正后完整代码
#include<stdio.h> #include<pthread.h> #include<stdlib.h> typedef struct Calc { int a,b; }C; void *add(void* arg) { C* temp = (C *)arg; int ans= temp->a + temp->b; printf("Sum is %d\n",ans); return NULL; } void *sub(void* arg) { C* temp = (C *)arg; int ans= temp->a - temp->b; printf("Sub is %d\n",ans); return NULL; } void *mul(void* arg) { C* temp = (C *)arg; int ans= temp->a * temp->b; printf("mul is %d\n",ans); return NULL; } // 改名避免和标准库div冲突 void *my_div(void* arg) { C* temp = (C *)arg; int ans= temp->a / temp->b; printf("div is %d\n",ans); return NULL; } int main() { pthread_t t1, t2, t3, t4; C* calc = (C *)malloc(sizeof(C)); calc->a = 7; calc->b = 4; // 修正传参:第三个参数传函数指针,第四个传参数 pthread_create(&t1,NULL,add,calc); pthread_create(&t2,NULL,sub,calc); pthread_create(&t3,NULL,mul,calc); pthread_create(&t4,NULL,my_div,calc); // 等待所有子线程执行完成 pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); // 释放堆内存 free(calc); return 0; }
内容的提问来源于stack exchange,提问作者joy
相关产品推荐
相关产品推荐

