不是的,线程函数并不一定只能有一个形参。线程函数的形参个数和类型取决于具体的实现,通常可以根据需要自由定义。
在 POSIX 线程(pthread)中,线程函数的原型是:
void *start_routine(void *arg);
其中,arg 参数是线程函数的形参,可以是任何类型的指针类型。在使用 pthread_create() 函数创建线程时,可以将一个指向线程函数的指针作为参数传递给该函数,该指针指向的函数可以包含多个形参。
例如,下面的线程函数有两个形参:
void *thread_func(void *arg1, void *arg2) {
// 线程函数的实现
return NULL;
}
在使用 pthread_create() 函数创建线程时,可以将指向 thread_func() 函数的指针作为参数传递给该函数,同时将需要的参数作为一个结构体打包传递给线程函数:
typedef struct {
int arg1;
char *arg2;
} ThreadArgs;
void *thread_func(void *args) {
ThreadArgs *thread_args = (ThreadArgs *)args;
int arg1 = thread_args->arg1;
char *arg2 = thread_args->arg2;
// 线程函数的实现
return NULL;
}
int main() {
ThreadArgs thread_args = {42, "hello"};
pthread_t thread;
pthread_create(&thread, NULL, thread_func, (void *)&thread_args);
// ...
}
在上述代码中,我们将两个参数打包成一个结构体 ThreadArgs,并将其作为 void* 类型的参数传递给线程函数。在线程函数中,我们可以通过将 void* 类型的参数转换为 ThreadArgs* 类型来获取参数的值。