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
相关产品推荐
相关产品推荐

