从新线程C调用方法

我正在研究一个项目(不是家庭作业),在C中构建一个multithreading的数独解决方案validation器。我是C的新手,所以请原谅我的代码质量不好,因为我还在改进。

我想从9个单独的线程中调用方法row_check 9次。 对于作为参数的方法,我传递行号( arg )和数组名称( arr )。 我创建了线程,但我不确定如何将参数正确传递给方法。 谁能帮我这个?

 #include  #include  #include  #include  void* row_check(void* arg, int *arr) { int i = *((int *)arg); //trying to convert row number to int int j, flag; while(i < 9) { flag=0x0000; for(j = 0; j < 9; j++) flag |= 1 << (arr[i][j]-1); if (flag != 0x01FF) report("row", i, j-1); } } void report(char *s, int i, int j) { printf("\nThe sudoku is INCORRECT"); printf("\nin %s. Row:%d,Column:%d", s, i+1, j+1); getch(); exit(0); } int main(int argc, char* argv[]) { int i,j; char arr1[9][9]; FILE *file = fopen(argv[1], "r"); if (file == 0) { fprintf(stderr, "failed"); exit(1); } int col=0, row=0; int num; while(fscanf(file, "%d ", &num) == 1) { arr1[row][col] = num; col++; if(col == 9) { row++; col = 0; } } fclose(file); pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); int n; for(n=0; n < 9; n++) //creating 9 threads { pthread_create(&tid, &attr, row_check, n); pthread_join(tid, NULL); } return 0; } 

线程入口函数必须是void *(*start_routine) (void *)格式,这意味着它只接收一个参数 – 指向你喜欢的任何东西的指针。

最常用的技术是使用要传递给线程入口函数的值定义struct 。 创建该类型的变量,初始化它并将其地址传递给线程入口函数。

例:

 typedef thread_data_s { char *ptr; int row_num; // I would prefer to define it as `unsigned int` but I stick to your example // + any other data you want to pass to the thread } thread_data_t; .... thread_data_t data[NUM_OF_THREADS]; .... for(n=0; n < NUM_OF_THREADS; n++) //creating 9 threads { data[n].ptr = &arr1[n][0]; data[n].row_num = n; pthread_create(&tid, &attr, row_check, &data[n]); } ... for(n=0; n < NUM_OF_THREADS; n++) // waiting for all the threads here { pthread_join(tid, NULL); } 

你的入门函数应该是这样的:

 void* row_check(void* data) { //int i = *((int *)arg); //trying to convert row number to int thread_data_t *my_data_ptr = data; int j, flag; while(i < 9) { flag=0x0000; for(j = 0; j < 9; j++) flag |= 1u << ( (my_data_ptr->ptr)[my_data_ptr->row_num][j] - 1 ); // Shouldn't it be under the `for` loop block? If so, please add `{}` to the `for` loop if (flag != 0x01FF) report("row", my_data_ptr->row_num, j-1); } return NULL; }