【问题标题】:C: merging temp files created with tmpfile() function with multithreadingC:将使用 tmpfile() 函数创建的临时文件与多线程合并
【发布时间】:2010-11-01 14:36:37
【问题描述】:

我有 n 个文件,我的程序需要使用线程和临时文件将所有文件的内容合并到一个文件中(必须使用 tmpfile())。创建线程时,它必须将 2 个文件合并到一个临时文件(temp1)中,然后另一个线程将下一个 2 个文件合并到另一个临时文件(temp2)等等,然后在下一个级别,另一个线程应该将 temp1 与 temp2 合并到另一个临时文件。

我正在考虑创建一个文件名数组,将其作为参数传递给 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() 打开的临时文件以生成新的临时文件?

【问题讨论】:

  • "我不知道如何获取临时文件名。" - 你不能,一般来说这就是 tmpfile 的重点
  • 没错,Paul,那么我如何“存储”这些临时文件以便以后阅读?
  • 创建一个保存名称的数组。在每一步之后,将这些文件合并到新文件中(随时保存这些名称)。这里想到了“递归”这个词;)
  • 如果你的意思是“稍后”运行这个或另一个程序:你不能,因为 tmpfile() 完成后删除文件;
  • @Kevin 问题是我无法使用 tmpfile() “保存”临时文件的名称,我认为是递归的,但我认为如果我使用它,它会在一个线程中完成所有操作(我需要一个线程来进行每次合并)。 @Peter 当我说“稍后”时,我的意思是在同一个程序的下一个线程中

标签: c multithreading merge pthreads


【解决方案1】:

能否使用tmpnam() 代替tmpfile(),并根据需要手动打开/关闭/删除文件?

【讨论】:

  • 或者我们可以使用 FILE * ptrs 的全局数组来 tmp 文件,并传入合并两个临时文件的线程所需的索引对。
  • @Sudhanshu 好吧,作为全局数组,我还不知道数组大小,但我可以使用 malloc,然后你说我可以访问文件内容抛出指针?可能。 @Oli 我正在研究 tmpnam() 并且我遇到了如何获取临时文件名的问题。
  • @g0d1anier:cplusplus.com/reference/clibrary/cstdio/tmpnam。这是 C++ 参考,但基本上是相同的想法。
  • 来自 OP -“必须使用 tmpfile()”
【解决方案2】:

您有文件开头的列表(我假设),因此您将打开所有文件(返回 FILE *)。

在您的合并排序函数 (MSF) 中,tmpfile() 返回一个 FILE *,这是您的 MSF 应该返回的。因此,您从 MSF 中返回的值将成为您下一次调用 MSF 的两个输入之一。这种情况一直持续到您只有一个 FILE * 可供操作。

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2015-04-20
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多