gpt4 book ai didi

C程序退出没有任何输出

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:50 26 4
gpt4 key购买 nike

之前有一个关于多线程问题的问题 Here .现在的问题是程序在没有任何输入的情况下退出。该程序从作为参数给出的文本文件中获取输入并执行。它应该只包含由空格分隔的数字,如果有任何其他字符,它应该像 row_check 函数中那样给出错误。任何人都可以建议为什么它会毫无错误地退出吗?

#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<ncurses.h>
const unsigned int NUM_OF_THREADS = 9;
typedef struct thread_data_s {
char *ptr;
int row_num;
} thread_data_t;

void report(const char *s,int w,int q);

void* row_check(void* data)
{
thread_data_t *my_data_ptr = data;
int j, flag;

flag=0x0000;

for(j = 0; j < 9; j++)
{
flag |= 1u << ( (my_data_ptr->ptr)[j] - 1 );

if (flag != 0x01FF){
report("row", my_data_ptr->row_num, j-1);
}
}

return NULL;
}

void report(const char *s,int w,int q)
{
printf("\nThe sudoku is INCORRECT");
printf("\nin %s. Row:%d,Column:%d",s,w+1,q+1);
getchar();

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, "%c ", &num) ==1) {
arr1[row][col] = num;
col++;

if(col ==9)
{
row++;
col = 0;
}
}

fclose(file);

int n;

thread_data_t data[NUM_OF_THREADS];
pthread_t tid;
pthread_attr_t attr;


for(n=0; n < NUM_OF_THREADS; n++)
{
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++)
{
pthread_join(tid, NULL);
}


return 0;

}

最佳答案

下面是代码中的一个问题,它可以解释为什么应用程序这么快就存在了......

以下代码不会加入它创建的所有线程(因此应用程序会在线程完成运行之前退出并终止线程):

thread_data_t data[NUM_OF_THREADS];
pthread_t tid;
pthread_attr_t attr;

for(n=0; n < NUM_OF_THREADS; n++)
{
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++)
{
pthread_join(tid, NULL);
}

如您所见,代码仅保存指向其中一个线程的指针(tid 中的值始终被替换,覆盖现有数据)并加入该线程(而不是所有线程他们)。

这可能更好地构造为:

thread_data_t data[NUM_OF_THREADS];
pthread_t tid[NUM_OF_THREADS];

for(n=0; n < NUM_OF_THREADS; n++)
{
data[n].ptr = &arr1[n][0];
data[n].row_num = n;
pthread_create(tid + n, NULL, row_check, &data[n]);
}


for(n=0; n < NUM_OF_THREADS; n++)
{
pthread_join(tid[n], NULL);
}

这样,应用程序将在返回之前等待所有线程完成其任务(并报告任何错误)。

关于C程序退出没有任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43443535/

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