【发布时间】:2010-02-28 03:26:10
【问题描述】:
我在 Linux 机器上使用 C 和 pthread,但我无法并行化程序。
我基本上是在尝试获取一个数据文件文件夹,将它们分成组,每个组由一个线程处理,并在每个数据文件上运行一个函数。
我这样做的方式是我有一个全局 char **filename 变量,其中 filename[i] = 数据文件的文件名。在主函数中,我将使用 scandir 读取所有数据文件的文件名(减去“.”和“..”)并将它们放入文件名变量中。然后创建 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() 中有一个 pthread_join 用于所有 4 个线程。
我已检查文件名是否已正确存储在 main() 和 Process() 中。但是,我在 Process() 中不断遇到分段错误:
for (i = start_index; i <= end_index ; i++)
fin = fopen(filename[i], "rb"); <--- Seg fault
我真的不明白为什么会出现错误,因为没有线程试图打开同一个文件。
请指教。
【问题讨论】:
-
请贴出创建文件数组的代码...
-
您是否尝试过在 gdb 中运行它并查看
i在出现段错误时是什么? -
还有,当出现段错误时,
filename[i]是什么? -
当
scandir返回非4 的倍数时,请注意舍入错误和超出文件名[] 数组最多3 个插槽。此外,您是否正确传输了来自scandir的所有文件名指针' s namelist 并且在所有工作线程完成之前未释放 namelist 的成员? -
先试试单线程的代码。它也有段错误吗?