2016-02-11 6 views
0

У меня есть функция, которая обрабатывает файл. В моем основном методе у меня есть цикл, который создает (# файлов) дочерние потоки и обрабатывает их одновременно. У меня должен быть определенный результат, например, вывод должен быть точно таким же, как вызваны файлы, поэтому, если моя программа вызывается с «файлом file2 file3 file.out», выход должен быть «output file1, output 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; 
} 

ТАК, что мне нужно сделать, это в основном метод как-то следить за переменные е для каждого потока. Мне запрещено использовать трубы. Я попытался создать другую глобальную переменную x, назначить ее на e на каждой итерации до/после создания потока, но внутри thread_file он всегда выводит x как значение последней итерации.

В принципе, мне нужно, чтобы переменная e хранилась с различным значением в зависимости от номера файла. Затем, в конце основного метода, я могу напечатать его по порядку.

Любая помощь будет высоко оценена. Благодарю.

ответ

1

Самое простое решение состоит в том, чтобы сделать массив векторов глобальным (сделать его более динамичным или лишенным размера переполнения ...), а затем позволить каждому потоку ждать завершения предыдущего (нить n вызывает соединение в потоке n-1, кроме потока 0), прежде чем выплевывать свой вывод.

Надеюсь, они не начнут выводить материал сразу же, как только начнут считывать свои входы ... Или вы должны кэшировать его, а затем дождаться окончания предыдущего, прежде чем писать этот кеш.

HTH

0

Я получил его для работы. Я использовал структуру с переменной e на каждой итерации. Затем я передал его в свой thread_create.

Это сработало!