我正在学习如何使用线程,根据我的理解和我所读到的内容,我做的一切都是正确的(显然我不是)。程序编译并没有给出任何错误,尽管看起来线程没有被创建。
我有一个包含所有包含内容和结构的头文件。我想保持程序原样(主要将结构发送到另一个函数并在该函数上创建线程)
这是我到目前为止所得到的代码:
话题
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
我做错了什么?这些线程甚至不打印第一行,但创建它们时不会出错。
如果您需要更多信息,请随时询问并提前致谢
最佳答案
将(void*)data+i
更改为(void*)(data+i)
。
前者格式错误(void 指针上没有指针算术),如果你的编译器让你侥幸逃脱,那么 a) 你没有教会你的编译器表现良好,它在浪费你的时间,并且b) 你可能会得到一些你本意之外的东西。
结果:使用高质量的编译器是值得的,它可以帮助您更好地理解 C。优秀编译器的示例:
gcc -W -Wall -Wextra -pedantic -std=c11
clang -W -Wall -Wextra -pedantic -std=c11
关于c - 在 C 中将结构发送到线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295298/