2010-02-28 66 views
1

我在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]。完成后,所有4个线程的main()中都有一个pthread_join。

我已检查文件名已正确存储在main()和Process()中。不过,我不断收到分段故障在这里,在工艺():

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

我真的不知道为什么因为没有线程试图打开同一文件应该有一个错误。

请指教。

+2

请将代码放在创建文件数组的地方...... – 2010-02-28 03:28:09

+0

您是否尝试过在gdb中运行它并查看段错误时发生了什么? – 2010-02-28 03:29:28

+1

而且,'filename [i]'是什么时候它segfaults? – 2010-02-28 03:30:07

回答

0

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

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

0

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

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

显示代码片段可恶地泄漏文件流,因为它在每次迭代时都会覆盖fin。我认为这是一种将测试代码减少到最低限度而非(尚未)工作程序的实际行为的假象。

+0

对于大多数Linux系统通常有1024个进程可以拥有的文件句柄数量有软硬限制。确保你没有多使用那个。 ulimit将显示您允许单个进程拥有的文件数量。如果您打开更多,然后允许数量的文件更改限制,它应该工作。 – Rohit 2010-06-23 08:08:40

0

这与线程无关。

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

尝试使用strdup来设置文件名[我],看看是否有效。