我在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
我真的不明白为什么会出现错误,因为没有线程试图打开同一个文件。
请告知。
答案 0 :(得分:0)
我猜这里,您可能会将filename[i]
设置为namelist[i]->d_name
,然后在free(3)
上调用namelist[i]
。在此之后,指向文件名的指针无效。或者free(3)
发生在主线程和具有处理线程的比赛中。你真的需要strdup(3)
每个字符串,只有在完成它之后才释放内存。
我当然可能是错的,因为给出的代码没有显示如何分配字符串。
答案 1 :(得分:0)
崩溃发生时,start_index
和end_index
以及i
的值是多少?
如果i
受到控制,代码不应该崩溃 - 所以这是我要检查的第一件事。
show code片段令人憎恶地泄漏文件流,因为它会在每次迭代时覆盖fin
。我认为这是将测试代码减少到最小而不是(尚未)工作程序的实际行为的假象。
答案 2 :(得分:0)
这与线程无关。
线程是否在分配文件名之前执行代码?你的索引是否正确?如果filename来自scandir ...你是复制文件名还是只指向scandir返回的值...因为这个值不是很好的长期。你是否将filename [i]指向调用scandir的函数堆栈上的字符串?
尝试使用strdup设置filename [i]并查看是否有效。