gpt4 book ai didi

从新线程 C 调用方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:58 24 4
gpt4 key购买 nike

我正在做一个项目(不是家庭作业),用 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;
}

最佳答案

线程入口函数的格式必须是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;
}

关于从新线程 C 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43430810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com