代码之家  ›  专栏  ›  技术社区  ›  jahmax

在c中传递char[N]作为线程参数?

  •  1
  • jahmax  · 技术社区  · 14 年前

    这是我的密码:

    void *PrintLine(void *line)
    {
        printf("Line: #%s\n", (char *)line);
        pthread_exit(NULL);
    }
    
    int main (int argc, char *argv[])
    {
        char line[80];
        while(fgets(line,sizeof(line),fp))
        {
            pthread_create(&threads[rt], NULL, PrintLine, (void*)line);
        }
        fclose(fp);
    }
    

    请不要告诉我运行一个线程只打印一个文件行是没有意义的,我删除了很多代码,以便更容易阅读和理解我的问题。

    您可能会猜到这段代码不起作用,我应该怎么做才能在线程中打印/使用“line”?

    4 回复  |  直到 14 年前
        1
  •  3
  •   nos    14 年前

    你在传递一个指向 line 到新创建的线程,当您的线程开始使用时 线 ,也许福格茨还写了别的东西。或者当你的线程访问它时,它正在写东西。

    你可以传一份你读过的台词,记住 free()

    char *copy_of_line = strdup(line);
    if(copy_of_line)
      pthread_create(&threads[rt], NULL, PrintLine, copy_of_line);
    
        2
  •  2
  •   Nikolai Fetissov    14 年前

    你需要 pthread_join(3) main 线程等待生成的每个线程的完成。否则主线程可能 结束这个过程 在其他线程有机会进行打印之前(还要确保生成的线程指向的堆栈内存仍在范围内)。

    编辑:

    然后发布“真实”代码,或者至少是“工作”代码。我们不是读心术的人。

    另一个明显的错误是主线程覆盖了其他线程应该打印的缓冲区。不能保证缓冲区中的字符串在某个点不是以零结尾的。你真的需要做个决定 在主线程中复制 在给其他线程之前。

        3
  •  0
  •   Paul R    14 年前

    • 你只有 line
        4
  •  0
  •   Jens Gustedt    14 年前