You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言用pthread线程实现简易计算器时pthread_create报错如何解决

问题解答

错误产生原因

  • pthread_create第三个参数要求传入线程入口函数的指针,类型规范为void *(*)(void *),即返回值为void*、仅接收1个void*类型参数的函数指针。
  • 你的代码中直接写add(calc)、sub(calc)是当场执行对应函数,将函数的返回值(void*类型)传入了第三个参数,类型完全不匹配,因此触发类型兼容报错。
  • 补充说明:该写法会导致运算逻辑直接在主线程执行,完全没有实现子线程运行运算的预期效果。

修复方案

核心修改点

  1. 调整pthread_create传参逻辑:第三个参数仅传入函数名(即函数本身的指针),需要传递给线程的参数calc放到第四个参数位传入。
  2. 新增pthread_join调用,等待所有子线程执行完成后再退出主线程,否则主线程提前结束会直接终止进程,子线程来不及执行运算逻辑。
  3. 重命名自定义的div函数,避免和C标准库的同名函数产生冲突,可改为my_div。
  4. 新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:54:02