我正在学习如何使用线程,根据我的理解和我所读到的内容,我正在做的一切正确(显然我不是)。程序编译并且没有错误,尽管看起来好像没有创建线程。
我有一个包含所有包含和结构的头文件。我想保持程序不变(主要发送到另一个函数结构并在该函数上创建线程)
以下是我到目前为止的代码:
主题
void * print_data(void *arg){
Vector *data= (Vector*)arg;
printf("THREAD\n");
printf("Number: %d\n",data->number);
printf("Name: %s\n",data->name);
printf("Address: %s\n", data->address);
printf("\n");
pthread_exit(NULL);
}
创建/调用线程的函数
void fills_vector(Vector *dados){
pthread_t threads[VECSIZE];
int i, s;
for(i = 0; i < VECSIZE; i++){
printf("Creating thread %d...\n", i);
s = pthread_create(&threads[i], NULL, print_data, (void*)data+i);
if(s < 0){
perror("Error creating the thread");
exit(-1);
}
}
}
主要
int main(void){
Vector data[VECSIZE];
data[0].number=1; data[0].name="João" ; data[0].address="Rua A";
data[1].number=2; data[1].name="Ana" ; data[1].address="Rua B";
data[2].number=3; data[2].name="Pedro" ; data[2].address="Rua C";
data[3].number=4; data[3].name="Clara" ; data[3].address="Rua D";
data[4].number=5; data[4].name="Manuel" ; data[4].address="Rua E";
fills_vector(data);
return 0;
}
结构为
typedef struct Vector{
int number;
char *name;
char *address;
} Vector;
和VECSIZE = 5
我做错了什么?线程甚至不打印第一行,但它不会产生错误。
如果您需要更多信息,请随时提出并提前致谢
答案 0 :(得分:2)
将(void*)data+i
更改为(void*)(data+i)
。
前者是格式错误的(在void指针上没有指针算法),如果你的编译器让你逃脱它,那么a)你没有教你的编译器表现良好而且浪费你的时间, b)你可能最终会得到一些你不想要的东西。
Upshot:使用高质量的编译器可以帮助你更好地理解C。良好编译器的例子:
gcc -W -Wall -Wextra -pedantic -std=c11
clang -W -Wall -Wextra -pedantic -std=c11
答案 1 :(得分:1)
基本上main()函数不等待线程完成。 您需要一些同步机制。 您可以在创建所有线程后通过在fills_vector中调用pthread_join来修复它。