1. 前言
在C语言中,经常需要使用多线程编程来提高程序的运行效率。在pthread库中,pthread_create函数是创建线程的入口函数,该函数可以用来启动新的子线程。
很多时候,我们需要向线程函数传递一些参数,这时可以初始化一个结构体,在pthread_create函数中进行传递,或者直接将值通过指针传递。下面将详细讲解“C语言中pthread_create函数实现向线程函数传递参数”这个问题。
2. 通过结构体传递参数
2.1 定义结构体
首先,我们需要定义一个结构体,来存储传递给线程函数的参数。结构体中包含所有需要传递的参数。
#include <stdio.h>
struct thread_arg {
int arg1;
char arg2;
float arg3;
};
2.2 创建线程
创建线程时,需要传递一个函数指针和一个参数,其中,参数就是我们需要传递给线程函数的参数。这里我们就需要利用结构体来传递参数。
首先,定义一个类型为 pthread_t 的变量来存储新线程的 ID 。然后,使用 pthread_create 函数来创建新的线程。
pthread_t tid;
struct thread_arg arg;
int ret;
/* 初始化需要传递的参数 */
arg.arg1 = 10;
arg.arg2 = 'a';
arg.arg3 = 1.23;
/* 创建线程 */
ret = pthread_create(&tid, NULL, thread_func, (void *)&arg);
if (ret) {
printf("create pthread error!\n");
return 1;
}
在 pthread_create 函数中,第一个参数是指向 pthread_t 类型变量的指针,用于存储新线程的ID。第二个参数是线程属性,一般为 NULL 。第三个参数为线程函数指针。第四个参数为传递给线程函数的参数,因此我们需要将结构体指针传递给它。
2.3 线程函数实现
线程函数只需要接受一个参数,即结构体指针。我们可以将这个指针转换成结构体类型,然后读取结构体中的参数。
void *thread_func(void *arg)
{
struct thread_arg *parg = (struct thread_arg *)arg;
printf("arg1 = %d\n", parg->arg1);
printf("arg2 = %c\n", parg->arg2);
printf("arg3 = %f\n", parg->arg3);
/* 线程执行任务 */
pthread_exit(NULL);
}
2.4 示例
看下面的完整程序,该程序创建一个新线程,并向线程函数传递三个参数,分别是 int , char 和 float 。线程函数简单地打印出这三个参数的值。
#include <stdio.h>
#include <pthread.h>
struct thread_arg {
int arg1;
char arg2;
float arg3;
};
void *thread_func(void *arg)
{
struct thread_arg *parg = (struct thread_arg *)arg;
printf("arg1 = %d\n", parg->arg1);
printf("arg2 = %c\n", parg->arg2);
printf("arg3 = %f\n", parg->arg3);
/* 线程执行任务 */
pthread_exit(NULL);
}
int main()
{
pthread_t tid;
struct thread_arg arg;
int ret;
/* 初始化需要传递的参数 */
arg.arg1 = 10;
arg.arg2 = 'a';
arg.arg3 = 1.23;
/* 创建线程 */
ret = pthread_create(&tid, NULL, thread_func, (void *)&arg);
if (ret) {
printf("create pthread error!\n");
return 1;
}
/* 主线程执行任务 */
pthread_exit(NULL);
}
3. 直接传递指针
除了使用结构体来传递参数外,还可以直接将参数以指针的形式传递给线程函数。
3.1 创建线程
创建线程时,直接将参数的地址传递给线程函数即可。需要注意的是,参数必须是通过 malloc 函数动态分配的内存。
pthread_t tid;
int *parg;
int ret;
/* 动态分配内存,存储需要传递的参数 */
parg = (int *)malloc(sizeof(int));
if (parg == NULL) {
printf("malloc error!\n");
return 1;
}
*parg = 100;
/* 创建线程 */
ret = pthread_create(&tid, NULL, thread_func, (void *)parg);
if (ret) {
printf("create pthread error!\n");
return 1;
}
3.2 线程函数实现
线程函数接受一个参数,直接将这个参数转换成 int 类型指针,然后读取指针指向的值。
void *thread_func(void *arg)
{
int *parg = (int *)arg;
printf("arg = %d\n", *parg);
/* 线程执行任务 */
pthread_exit(NULL);
}
3.3 示例
看下面的完整程序,该程序创建一个新线程,并向线程函数传递一个 int 型变量。线程函数简单地打印出这个参数的值。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *thread_func(void *arg)
{
int *parg = (int *)arg;
printf("arg = %d\n", *parg);
/* 线程执行任务 */
pthread_exit(NULL);
}
int main()
{
pthread_t tid;
int *parg;
int ret;
/* 动态分配内存,存储需要传递的参数 */
parg = (int *)malloc(sizeof(int));
if (parg == NULL) {
printf("malloc error!\n");
return 1;
}
*parg = 100;
/* 创建线程 */
ret = pthread_create(&tid, NULL, thread_func, (void *)parg);
if (ret) {
printf("create pthread error!\n");
return 1;
}
/* 主线程执行任务 */
pthread_exit(NULL);
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中pthread_create函数实现向线程函数传递参数 - Python技术站