2016-02-11 88 views
0

我有一个处理文件的函数。在我的主要方法中,我有一个创建(#文件)子线程的循环,并且同时处理它们。我必须有一个特定的输出,例如输出需要与文件被调用的完全相同,所以如果我的程序使用“a.out file1 file2 file3”调用,则输出需要是“输出file1,输出file2,输出文件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存储为不同的值。然后,在主要方法结束时,我可以按顺序打印它。

任何帮助将不胜感激。谢谢。

回答

1

最简单的解决方案是将矢量数组设置为全局的(使其更具动态性,或以更小的尺寸大小......),然后让每个线程等待前一个线程完成(线程n调用线程连接n-1,除了线程0)在吐出它的输出之前。

希望他们不会立即开始输出东西,因为他们开始阅读他们的输入......或者你必须缓存它,然后等待前一个完成,然后再写入该缓存。

HTH

0

我得到它的工作。我在每次迭代时都使用了一个带有变量e的结构体。然后我将它传递给我的thread_create。

它的工作!