继承我的代码:
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”?
答案 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
的实例(想一想)答案 3 :(得分:0)
您的问题是所有线程都使用相同的行缓冲区,因此在打印另一行之前可能会读取新行。