C: объединение временных файлов, созданных с помощью функции tmpfile (), с многопоточностью - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть n файлов, и моя программа должна объединить содержимое всего в один файл, используя потоки и временные файлы (необходимо использовать tmpfile ()).При создании потока он должен объединить 2 файла во временный файл (temp1), затем другой поток объединит следующие 2 файла в другой временный файл (temp2) и т. Д., А на следующем уровне другой поток должен объединить temp1 с temp2 вдругой временный файл.

alt text

Я думал о создании массива имен файлов, передавая его в качестве аргумента pthread_create, и функция должна возвращать измененный массив, но я не могупонять, как получить имя временного файла.Будет что-то вроде этого:

int main(int argc, char *argv[]){

int n = argc -1;

char *files_arr[n];

pthread_t threads[n-1];

}

    for (int i=0; i < argc; i++)

    {
       pthread_create (&threads[i], NULL, temp_merge, (void *) &files_arr);
    }
}//end main

void *temp_merge (void *arg){

    char *myarray[];
    myarray = (char *) arg;
    FILE *f1, *f2, *tf;
    tf = tmpfile();

    //code to merge f1 and f2 into tf, f1 and f2 could be temp files created before

     pthread_exit((void*) myarray); //Do I lose the temp file using pthread_exit? 
}

Вопрос: как я могу получить доступ к временному файлу, открытому ранее с помощью tmp () в предыдущем потоке, чтобы сгенерировать новые временные файлы?

Ответы [ 2 ]

1 голос
/ 01 ноября 2010

Не могли бы вы использовать tmpnam() вместо tmpfile() и вручную открывать / закрывать / удалять файлы при необходимости?

0 голосов
/ 01 ноября 2010

У вас есть список файлов для начала (я полагаю), поэтому вы откроете все из них (возвращая FILE *).

В вашей функции слияния (MSF) tmpfile () возвращает FILE *, что должно вернуть ваше MSF. Таким образом, ваше возвращаемое значение от MSF становится одним из двух входных данных вашего следующего вызова MSF. Это продолжается до тех пор, пока у вас не останется только один FILE *.

...