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