在Linux中,使用POSIX线程(pthread)时,可以通过以下两种方法传递参数:
创建一个全局变量,将需要传递的参数设置为全局变量的值。然后在创建pthread时,将全局变量的地址作为参数传递给pthread函数。在pthread函数内部,可以通过指针访问全局变量的值。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 全局变量
int arg1 = 10;
int arg2 = 20;
// pthread函数原型
void *print_args(void *args);
int main() {
pthread_t thread1, thread2;
// 创建第一个线程
pthread_create(&thread1, NULL, print_args, (void *)&arg1);
// 创建第二个线程
pthread_create(&thread2, NULL, print_args, (void *)&arg2);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
// pthread函数
void *print_args(void *args) {
int arg = *((int *)args);
printf("Thread ID: %ld, Argument: %d\n", (long)pthread_self(), arg);
return NULL;
}
定义一个结构体,将需要传递的参数封装到结构体中。然后在创建pthread时,将结构体的地址作为参数传递给pthread函数。在pthread函数内部,可以通过指针访问结构体的成员变量。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 定义结构体
typedef struct {
int arg1;
int arg2;
} Args;
// pthread函数原型
void *print_args(void *args);
int main() {
pthread_t thread1, thread2;
// 创建结构体实例
Args arg1 = {10, 0};
Args arg2 = {0, 20};
// 创建第一个线程
pthread_create(&thread1, NULL, print_args, (void *)&arg1);
// 创建第二个线程
pthread_create(&thread2, NULL, print_args, (void *)&arg2);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
// pthread函数
void *print_args(void *args) {
Args *arg = (Args *)args;
printf("Thread ID: %ld, Argument1: %d, Argument2: %d\n", (long)pthread_self(), arg->arg1, arg->arg2);
return NULL;
}
这两种方法都可以实现将参数传递给pthread函数。使用全局变量时需要注意线程间的同步问题,避免数据竞争。而使用结构体则更加安全和灵活。