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

C++实现线程池调用pthread_create传递参数报错如何解决

问题根源

错误完全是线程ID数组的类型定义不匹配导致的:

  • pthread_create第一个入参要求是pthread_t*类型,用来存储新创建线程的ID;但你在ThreadPool类中错误将threads数组定义为pthread_mutex_t*(互斥锁指针)类型,两种类型完全不兼容,编译阶段就会报类型转换失败的错误。
  • 你当前定义的是指针数组,每个元素都没有分配实际存储pthread_t结构的内存空间,就算类型改对直接传空指针也会触发运行时错误。
修复方案

直接修改threads数组的定义,不用搞指针数组,用普通值类型数组即可,修改后代码如下:

class ThreadPool{    
    public:        
        BlockingQueue socket_bq;        
        // 把原来的pthread_mutex_t*数组改成pthread_t类型的数组,直接存储线程ID
        pthread_t threads[THREAD_NUM];   
        ThreadPool();        
        void init(pthread_attr_t* attr, void*(*start_routine)(void*), void* arg);
};

void ThreadPool::init(pthread_attr_t* attr, void*(*start_routine)(void*), void* arg){    
    // 创建线程
    for(int i = 0; i < THREAD_NUM; i++){        
        // 传当前线程ID变量的地址作为第一个参数
        if(pthread_create(&threads[i], attr, start_routine, arg)!=0){            
            fprintf(stderr, "Thread Pool Init: failed when creating threads");            
            exit(1);        
        }    
    }
}
额外注意事项
  • 如果你后续要把线程的入口函数设为ThreadPool类的成员函数,必须将其声明为静态成员,否则普通成员函数隐含的this指针会导致函数签名不符合pthread_create要求的入口函数格式。
  • 如果确实需要用指针数组存储线程ID,要提前给每个threads[i]分配sizeof(pthread_t)大小的堆内存,线程退出后记得手动释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Navxihziq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:08