我有一个任务,我必须编写一个C程序,根据多个过程中的大小对地震链表进行排序。对于作业的第一部分,我们的老师只允许我们使用多个进程而不是线程。
到目前为止,我能够在一个过程中对地震列表进行排序,但我不确定如何拆分链表并在不同的流程中对每个部分进行排序。我一直在研究使用共享内存,但我不确定如何正确使用它。
有没有更好的方法来解决这个问题?如果没有,我如何使用共享内存使用插入排序对地震列表进行排序?
答案 0 :(得分:2)
如何使用合并排序和多线程?
数组的每个分区都创建一个新线程,最后同步线程输出。因此,对于深度n,将存在<(2 ^ n + 1)个线程
因此,您平行地对链表进行排序,也没有资源处理错误的情况。
抱歉,没有足够的回购在评论中写下来。
答案 1 :(得分:0)
我会说快速排序比并行化更简单。原因是您只需要执行顺序传递进行分区(使用mergesort,您将需要两个,分区和合并)。一旦对数组(或列表)进行分区,序列就会分成两个独立的部分;它们永远不需要额外的处理,因为枢轴已经在它的最终位置。
但是,如果错误地选择了枢轴,则快速排序可能会降低en O(n ^ 2)。小心那个
尊重线程数,我建议固定数不大于核心数。再次,快速排序更容易。例如,如果您有4个线程,那么您使用第一个线程来执行第一个分区。然后,使用两个线程执行4个分区。使用这4个分区,您可以为每个线程分配每个分区。当4个线程加入调用线程时,数组将被排序。
答案 2 :(得分:0)
共享内存中链表的一个问题是让所有进程拥有共享内存的相同虚拟地址:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366763(v=vs.85).aspx
http://man7.org/linux/man-pages/man7/shm_overview.7.html
http://linux.die.net/man/2/mmap
我不知道您使用的是Linux还是Windows。
如果共享内存的基地址不相同,那么如msdn文章中所述,指针通常会替换为基址的偏移量。我不确定使用下一个“偏移”与下一个“指针”的链表是否适用于此分配。
此外,赋值使用插入排序,插入排序或插入排序的变体用于合并由进程创建的排序列表,还是允许使用合并列表函数合并列表?