并发线程和全局变量

时间:2016-02-11 22:46:26

标签: c multithreading

我有一个处理文件的函数。在我的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方法的最后,我可以按顺序打印它。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是使向量数组全局化(使其更具动态性,或者在过度杀伤大小时使用foxed ......)然后让每个线程等待前一个完成(线程n调用连接线程n) -1,除了线程0),然后吐出输出。

希望他们在开始阅读输入时不会立即开始输出内容......或者你必须先缓存它然后在写入缓存之前等待前一个完成。

HTH

答案 1 :(得分:0)

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

有效!