Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程和队列_C_Pthreads - Fatal编程技术网

C 线程和队列

C 线程和队列,c,pthreads,C,Pthreads,我想通过实现并行工作的线程来加速排序函数。我对pthread的基本知识是创建、连接和使用互斥来防止死锁 因此,我的问题是: 在线程完成任务后,如何将任务分配给线程?例如,如果我将列表的一半给线程1排序,另一半给任务2排序,任务1完成后,它应该跳转到任务2并帮助它 如果有帮助的话,我正在使用快速排序进行测试 我试着看看是否有一个任务分配函数,但我偶然发现的是不同的代码。没有什么特别复杂的 首先,您需要一个可等待的队列。也就是说,在队列为空时,为了允许线程等待而维护的事物列表 其次,您需要编写代码,

我想通过实现并行工作的线程来加速排序函数。我对pthread的基本知识是创建、连接和使用互斥来防止死锁

因此,我的问题是: 在线程完成任务后,如何将任务分配给线程?例如,如果我将列表的一半给线程1排序,另一半给任务2排序,任务1完成后,它应该跳转到任务2并帮助它

如果有帮助的话,我正在使用快速排序进行测试


我试着看看是否有一个任务分配函数,但我偶然发现的是不同的代码。

没有什么特别复杂的

首先,您需要一个可等待的队列。也就是说,在队列为空时,为了允许线程等待而维护的事物列表

其次,您需要编写代码,从可等待队列中弹出作业,如果队列中没有作业,则等待。然后它就完成了这项工作


这是我写的一些。它是C++的,但是从代码中看,一般的思想应该是显而易见的。

没有什么特别复杂的。 首先,您需要一个可等待的队列。也就是说,在队列为空时,为了允许线程等待而维护的事物列表

其次,您需要编写代码,从可等待队列中弹出作业,如果队列中没有作业,则等待。然后它就完成了这项工作


这是我写的一些。它是C++的,但是从代码来看,一般的思想应该是显而易见的。< /P>你指的是“跳转到任务二,帮助它”是什么意思?通常,你不会。您在执行时将任务分成不同的线程,让线程完成,然后合并结果。@MFisherKDX:有时会使用一个持久线程池,并动态分配任务,而不是重复创建和销毁线程。@MFisherKDX这也是我的假设,但有人建议,在一个线程(在线程池中)完成任务后,可以“打开”一个新任务,或者从另一个执行任务的线程中进行拆分,并对拆分进行排序。不确定这是否合理你所说的“跳转到任务二并帮助它”是什么意思?通常,你不会。您在执行时将任务分成不同的线程,让线程完成,然后合并结果。@MFisherKDX:有时会使用一个持久线程池,并动态分配任务,而不是重复创建和销毁线程。@MFisherKDX这也是我的假设,但有人建议,在一个线程(在线程池中)完成任务后,可以“打开”一个新任务,或者从另一个执行任务的线程中进行拆分,并对拆分进行排序。我不知道这是否合理,大卫。很好的线程池实现。但我看不出这是如何回答老年退休金问题的。他问,在给数组的每一半两个线程进行排序后,如何获取首先完成的线程,然后使用它“帮助仍在运行的线程”完成排序。这是一个更为复杂的问题,需要尝试回答,但没有多大帮助。在您的代码中,您有jobs.emplace(std::move(func));但是,当我查看pthread手册页面时,我找不到与emplace函数等效的C。@user10416282
emplace
是一个容器上的操作,如
std:vector
std::queue
。这不是一个特定于线程的操作。@user10416282只是将作业移到队列中。你可以随心所欲地实现它。@MFisherKDX这就是他想要做的,但阻止他这么做的具体问题是他没有这个问题的答案:“在线程完成任务后,我如何将任务分配给线程?”这就是我的答案。嗨,大卫。很好的线程池实现。但我看不出这是如何回答老年退休金问题的。他问,在给数组的每一半两个线程进行排序后,如何获取首先完成的线程,然后使用它“帮助仍在运行的线程”完成排序。这是一个更为复杂的问题,需要尝试回答,但没有多大帮助。在您的代码中,您有jobs.emplace(std::move(func));但是,当我查看pthread手册页面时,我找不到与emplace函数等效的C。@user10416282
emplace
是一个容器上的操作,如
std:vector
std::queue
。这不是一个特定于线程的操作。@user10416282只是将作业移到队列中。你可以随意实现它。@MFisherKDX这是他想要做的,但阻止他这么做的具体问题是他没有这个问题的答案:“在线程完成任务后,我如何将任务分配给线程?”所以我回答了这个问题。