我有一个处理文件的函数。在我的main方法中,我有一个创建(文件数)子线程的循环,并同时处理它们。我必须有一个特定的输出,例如输出需要与调用文件完全一样,所以如果用“a.out file1 file2 file3”调用我的程序,输出必须是“输出file1,输出文件2,输出文件3“。
现在,它以错误的顺序输出文件,显然是因为有些线程首先完成。
以下是我的代码:
char *output[10];
void *file_thread(void *arg)
{
//processing the file
// I need to write to output here.
}
int main (int argc, char **argv)
{
int e;
int status;
pthread_t thread[argc - 1];
// For each file
for (e = 1; e < argc; e++)
{
status = pthread_create(&thread[e-1], NULL, file_thread,
(char *)argv[e]);
if (status != 0)
{
err_abort(status, "pthread create");
}
}
for (e=0; e < argc - 1; e++)
{
pthread_join(thread[e], NULL);
}
/*
for(e=0; e < argc - 1; e++)
{
printf("%s", output[e]);
}
*/
return 0;
}
所以我需要做的是在main方法中以某种方式跟踪每个线程的变量e。我不允许使用烟斗。我尝试创建一个不同的全局变量x,在创建线程之前/之后的每次迭代中将其分配给e,但在thread_file中,它总是输出x作为最终迭代的值。
基本上,我需要根据文件编号以不同的值存储变量e。然后,在main方法的最后,我可以按顺序打印它。
非常感谢任何帮助。感谢。
答案 0 :(得分:1)
最简单的解决方案是使向量数组全局化(使其更具动态性,或者在过度杀伤大小时使用foxed ......)然后让每个线程等待前一个完成(线程n调用连接线程n) -1,除了线程0),然后吐出输出。
希望他们在开始阅读输入时不会立即开始输出内容......或者你必须先缓存它然后在写入缓存之前等待前一个完成。
HTH
答案 1 :(得分:0)
我得到了它的工作。我在每次迭代时使用了带变量e的结构。然后我把它传递给我的thread_create。
有效!