我一直在拼命尝试将结构传递给多个线程。问题是我找不到正确的格式来在pthread_create函数中传递它。它只是赢了工作。 如果试图将我的结构指针传递给pthread_create,但它只是不起作用。 我有指针分配错误。
typedef struct thread{
pthread_t thread_id;
char *filename;
int blocksize;
int random_int;
} ThreadData;
int main(int argc, char *argv[]) {
int nb_threads = atoi(argv[3]);
int blocksize = atoi(argv[2]);
int re;
int index;
char *name;
char* mode = argv[1];
int i = 0;
ThreadData thread[nb_threads];
int random_int;
srand(time(NULL));
random_int = rand();
index = detect_mode(mode);
index_glob = index;
for(i=0; i < nb_threads; i++){
snprintf(name, 25,"temp%d",i);
thread[i].filename = name;
thread[i].blocksize = blocksize;
thread[i].random_int = random_int;
switch(index_glob){
case 0:
re = pthread_create(&(thread[i].thread_id),NULL,write_seq_file,(void *)(&thread[i]));
break;
case 1:
re = pthread_create(&(thread[i].thread_id),NULL,write_ran_file,(void *)(&thread[i]));
break;
case 2:
re = pthread_create(&(thread[i].thread_id),NULL,read_seq_file,(void *)(&thread[i]));
break;
case 3:
re = pthread_create(&(thread[i].thread_id),NULL,read_ran_file,(void *)(&thread[i]));
break;
default:
exit(0);
break;
}
if(re == -1){
printf("Error creating thread %d / %d\n",(i+1),nb_threads);
}
else{
printf("Thread %d / %d created.\n",(i+1),nb_threads);
}
}
for(i=0; i< nb_threads; i++){
pthread_join(thread[i].thread_id, NULL);
}
return 0;
}
void* write_seq_file(void *thread){
ThreadData *my_data = (ThreadData*)thread;
char *filename = my_data->filename;
FILE* fp = fopen(filename,"w+");
int blocksize = my_data->blocksize;
char c = 'a';
long i;
for (i=0; i<blocksize; i++){
fputc(c,fp);
}
pthread_exit(NULL);
}
答案 0 :(得分:0)
我不太了解您的程序,我不确定这是否会按预期运行。 但;
以下是要编译的一些要点:
pthread_create期望void *(* start_routine)(void *)作为worker函数。因此,将write_seq_file和所有工作程序函数更改为以下格式。
void* write_seq(void *thread)
{
...
return NULL;
}
您的线程数据数组是一个对象数组。没有指针。因此,首先获取地址并将其转为无效。
re = pthread_create(&(thread[i].thread_id),NULL,write_seq_file,(void *)(&(thread[i])));
不确定中间是否退出(0)是个好主意。我宁愿用return 0;因为main函数必须返回一个值。
以下内容未在给定代码中声明。所以希望那里没有问题。
index = detect_mode(mode);
index_glob = index;
确保在main之前声明了函数原型,或者将函数实现移到main函数之上。
最后pthread_join期望pthread_t线程作为第一个参数。该行应该如下所示进行更改。
pthread_join(thread[i].thread_id, NULL);
希望这有帮助。