当我创建一个线程时,我想传递几个参数。所以我在头文件中定义了以下内容:
struct data{
char *palabra;
char *directorio;
FILE *fd;
DIR *diro;
struct dirent *strdir;
};
在 .c 文件中,我执行以下操作
if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){
perror("Error al crear el hilo. n");
exit(EXIT_FAILURE);
}
如何将所有这些参数传递给线程。我虽然关于:
1) 首先使用 malloc 为这个结构分配内存,然后给每个参数一个值:
struct data *info
info = malloc(sizeof(struct data));
info->palabra = ...;
2) 定义
struct data info
info.palabra = ... ;
info.directorio = ...;
然后,如何在线程中访问这些参数 void thread_function ( void *arguments){ ??? }
提前致谢
这是一个工作(相对较小的)示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
/*
* To compile:
* cc thread.c -o thread-test -lpthread
*/
struct info {
char first_name[64];
char last_name[64];
};
void *thread_worker(void *data)
{
int i;
struct info *info = data;
for (i = 0; i < 100; i++) {
printf("Hello, %s %s!n", info->first_name, info->last_name);
}
}
int main(int argc, char **argv)
{
pthread_t thread_id;
struct info *info = malloc(sizeof(struct info));
strcpy(info->first_name, "Sean");
strcpy(info->last_name, "Bright");
if (pthread_create(&thread_id, NULL, thread_worker, info)) {
fprintf(stderr, "No threads for you.n");
return 1;
}
pthread_join(thread_id, NULL);
return 0;
}
不要使用选项 #2。 可以覆盖data
结构(显式地,例如使用相同的结构启动另一个线程,或者隐式地,例如在堆栈上覆盖它)。 使用选项 #1。
要获取数据,请在线程开始时执行
struct data *info = (struct data*)arguments;
然后正常访问info
。 确保在线程完成时free
它(或者,正如我所希望的那样,让调用者在加入线程后释放它)。
创建一个指向结构的指针,就像你在上面的第一种情况下所做的那样:
//create a pointer to a struct of type data and allocate memory to it
struct data *info
info = malloc(sizeof(struct data));
//set its fields
info->palabra = ...;
info->directoro = ...;
//call pthread_create casting the struct to a `void *`
pthread_create ( &thread_id[i], NULL, &hilos_hijos, (void *)data);
1)你需要使用malloc而不是像下面那样定义
struct data *info;
info = (struct data *)malloc(sizeof(struct data));
并在 ptherad 调用中传递结构的指针,如下所示
pthread_create ( &thread_id[i], NULL, &thread_fn, (void *)info );
2)您可以在线程功能中访问它们,如下所示
void thread_function ( void *arguments){
struct data *info = (struct data *)arguments;
info->....
}