从新线程C调用方法

时间:2017-04-15 20:13:59

标签: c multithreading pthreads

我正在开发一个项目(NOT HOMEWORK),在C中构建一个多线程数独解决方案验证器。我是C的新手,所以原谅我的代码质量不好,因为我还在改进。

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

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


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;
}

1 个答案:

答案 0 :(得分: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;
}