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

时间:2010-07-08 15:06:53

标签: c multithreading pthreads

继承我的代码:

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 个答案:

答案 0 :(得分:3)

当你的线程到处使用line时,你正在向新创建的线程传递一个指向line的指针,但是fach已经为其写了一些东西。或者当你的线程访问它时,它可能正在编写内容。

你可以传递你读过的那一行的副本,当你在线程中完成它时,请记得free()

char *copy_of_line = strdup(line);
if(copy_of_line)
  pthread_create(&threads[rt], NULL, PrintLine, copy_of_line);

答案 1 :(得分:2)

您需要main线程中的pthread_join(3)等待您生成的每个线程的完成。否则主线程可能结束进程,然后其他线程有机会进行打印(并且还要确保指向生成线程的堆栈内存仍在范围内)。

编辑:

然后发布“真实”代码,或至少“工作”代码。我们不介意读者。

另一个明显的错误是主线程覆盖了其他线程应该打印的缓冲区。无法保证在某个时刻该缓冲区中的字符串不是以零终止的。在将其提供给其他线程之前,您确实需要在主线程中创建副本。

答案 2 :(得分:0)

两个直接明显的问题:

  • 您只有line的实例(想一想)
  • 无法保证printf是线程安全的

答案 3 :(得分:0)

您的问题是所有线程都使用相同的行缓冲区,因此在打印另一行之前可能会读取新行。