线程打开文件时出错

时间:2010-02-28 03:26:10

标签: c linux pthreads

我在Linux机器上使用C和pthread,而且我无法并行化程序。

我基本上试图接收数据文件的文件夹,将它们分成组,每个组由一个线程处理,并在每个数据文件上运行一个函数。

我这样做的方式是我有一个全局char **filename变量,其中filename [i] =数据文件的文件名。在main函数中,我将使用scandir读入所有数据文件的文件名(减去“。”和“..”)并将它们放在filename变量中。然后创建4个(任意数)线程,每个线程调用Process函数。在Process()中,每个线程仅打开(使用Process()中声明的FILE *fin并使用start_index和end_index处理部分数据文件。例如,如果有100个文件,则每个线程将处理filename[0]filename[24]filename[25]filename[49]filename[50]filename[74]和分别为filename[75]filename[99]。完成后,main()中的所有4个线程都有一个pthread_join。

我已检查过文件名是否已正确存储,包括main()和Process()。但是,我在Process()中不断得到分段错误:

for (i = start_index; i <= end_index ; i++)
   fin = fopen(filename[i], "rb"); <--- Seg fault

我真的不明白为什么会出现错误,因为没有线程试图打开同一个文件。

请告知。

3 个答案:

答案 0 :(得分:0)

我猜这里,您可能会将filename[i]设置为namelist[i]->d_name,然后在free(3)上调用namelist[i]。在此之后,指向文件名的指针无效。或者free(3)发生在主线程和具有处理线程的比赛中。你真的需要strdup(3)每个字符串,只有在完成它之后才释放内存。

我当然可能是错的,因为给出的代码没有显示如何分配字符串。

答案 1 :(得分:0)

崩溃发生时,start_indexend_index以及i的值是多少?

如果i受到控制,代码不应该崩溃 - 所以这是我要检查的第一件事。

show code片段令人憎恶地泄漏文件流,因为它会在每次迭代时覆盖fin。我认为这是将测试代码减少到最小而不是(尚未)工作程序的实际行为的假象。

答案 2 :(得分:0)

这与线程无关。

线程是否在分配文件名之前执行代码?你的索引是否正确?如果filename来自scandir ...你是复制文件名还是只指向scandir返回的值...因为这个值不是很好的长期。你是否将filename [i]指向调用scandir的函数堆栈上的字符串?

尝试使用strdup设置filename [i]并查看是否有效。