C程序退出而没有任何输出

时间:2017-04-17 00:19:44

标签: c multithreading pthreads

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

{{1}}

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

有人可以建议为什么它会在没有任何错误的情况下退出吗?

是的,

当拼图结果的所有9行都正确时,发布的代码无法执行,只是优雅地退出。

并进一步混淆逻辑。

发布的代码只检查最后创建的线程,当该线程退出时,程序退出,这并不意味着其他线程已退出

另一个严肃的细节。对pthread_create()的调用是传递attr变量的地址,但该变量包含堆栈中声明该变量的垃圾。由于代码没有为线程设置任何特定属性,强烈建议删除变量,并在第二个参数中使用NULL pthread_create()