如何为pthread线程传递多参数(含vector)及多函数?
pthread多参数线程函数传递方案
一、如何传递多参数给线程函数
pthread的pthread_create要求线程入口函数必须是void* (*)(void*)签名——也就是只能接收一个void*类型的参数,无法直接传入你定义的test(long int begin, long int end, vector<long int> x)这种多参数函数。解决方法是用结构体打包所有参数,再通过适配函数中转调用目标函数,具体步骤如下:
- 定义参数结构体
把test需要的所有参数封装到一个结构体里:
#include <pthread.h> #include <vector> struct ThreadArgs { long int begin; long int end; std::vector<long int> x; };
- 编写适配的线程入口函数
这个函数符合pthread要求的签名,负责把void*参数转回结构体指针,再调用你的test函数:
// 适配pthread的线程入口 void* thread_entry(void* arg) { ThreadArgs* args = static_cast<ThreadArgs*>(arg); // 调用目标函数test test(args->begin, args->end, args->x); // 释放动态分配的结构体内存(避免内存泄漏) delete args; return nullptr; }
- 创建线程并传递参数
动态分配参数结构体(避免栈内存提前销毁导致子线程访问非法内存),传入pthread_create:
void test(long int begin, long int end, std::vector<long int> x) { // 你的业务逻辑 } int main() { pthread_t thread_id; // 初始化参数结构体 ThreadArgs* args = new ThreadArgs{ .begin = 0, .end = 100, .x = {1, 2, 3, 4, 5} }; // 创建线程 int create_ret = pthread_create(&thread_id, nullptr, thread_entry, args); if (create_ret != 0) { // 创建失败时要释放已分配的内存 delete args; return 1; } // 等待线程执行完成 pthread_join(thread_id, nullptr); return 0; }
注意事项:
- 如果
test不需要修改vector,可以把结构体里的vector改成const std::vector<long int>&或指针,减少拷贝开销,但要保证原vector的生命周期覆盖子线程运行时间。 - 不要用栈上的结构体作为参数传递(比如
ThreadArgs args;然后传&args),否则主线程如果先于子线程退出,子线程会访问已销毁的栈内存,导致未定义行为。
二、能否同时传入多个带多参数的函数?
pthread本身是一个线程对应一个入口函数,如果要运行多个不同的多参数函数,只需要为每个目标函数编写对应的适配入口,然后创建多个线程即可。
比如你有两个目标函数test1和test2,可以分别定义它们的参数结构体和适配函数:
// 目标函数1 void test1(int a, std::string b) { /* ... */ } struct Test1Args { int a; std::string b; }; void* test1_entry(void* arg) { Test1Args* args = static_cast<Test1Args*>(arg); test1(args->a, args->b); delete args; return nullptr; } // 目标函数2 void test2(double x, double y) { /* ... */ } struct Test2Args { double x; double y; }; void* test2_entry(void* arg) { Test2Args* args = static_cast<Test2Args*>(arg); test2(args->x, args->y); delete args; return nullptr; } // 在main中创建两个线程 int main() { pthread_t tid1, tid2; Test1Args* args1 = new Test1Args{10, "hello"}; Test2Args* args2 = new Test2Args{3.14, 2.71}; pthread_create(&tid1, nullptr, test1_entry, args1); pthread_create(&tid2, nullptr, test2_entry, args2); pthread_join(tid1, nullptr); pthread_join(tid2, nullptr); return 0; }
内容的提问来源于stack exchange,提问作者DeadlyKitten999
相关产品推荐
相关产品推荐

