我必须编写一个C应用程序,它使用CURL在web上发布信息。应用程序最多只能并行地运行N个请求(比方说10个请求)。如何才能等待任何线程完成,而不是使用pthread_join()的特定线程。
我读过关于pthread_cond_wait的文章,但大多数例子是控制线程(main)如何唤醒工作线程。我需要的只是相反的-工作线程必须能够信号/唤醒父线程之前退出。
更新:实际上,我需要一种让管理线程休眠的方法,当一个工作线程完成它的任务时,它应该唤醒管理线程,给它另一个任务。如果线程结束并为作业创建新线程或使用线程池,这并不重要。萨尔仍然需要一种向经理暗示一项工作已经完成的方式。
,我希望我没有得到这个建议,
while(asleep){
for(i = 0; i< threadCount; i++){
pthread_mutex_lock(mutex);
if(threads[i] == IDLE_STATE)
startNewJob();
pthread_mutex_unlock(mutex);
usleep(100*1000);
}
}发布于 2012-12-15 03:01:31
条件变量是你想要的。它们可以很容易地用于从工作线程发出管理线程的信号,反之亦然。
最后的草莓例子实际上非常类似于使用条件变量所能做的事情:
pthread_mutex_lock(&mutex);
while (!finished) {
for(i = 0; i < threadCount; i++) {
if(threads[i] == IDLE_STATE)
startNewJob(i);
}
/* Not finished, and no idle threads, so wait */
if (!finished)
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);当线程完成时,它只需执行以下操作:
pthread_mutex_lock(&mutex);
threads[self] = IDLE_STATE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);发布于 2012-12-13 11:02:52
与按需创建/销毁线程相比,在启动时创建一个由10个工作线程组成的池,并让您的主程序将作业提供给它们,会更容易。
在启动时,您将创建一个由10名员工组成的数组。这些可能看起来像
typedef struct worker
{
pthread_t thread;
pthread_cond_t cond;
pthread_mutex_t mutex;
struct job* job;
int quit;
} worker;管理器将依次将作业委托给每个线程,方法是设置它们的job成员,然后向工作人员发送信号。
每个工人都会循环,直到quit成为非零,等待它的状态被信号.在每个信号之后,它将在报告结果之前读取/处理其job,然后再次等待其状态。
编辑:,您不喜欢线程池。您可以尝试为每个线程提供一个唯一的id;在管理器中存储id和每个线程的其他属性之间的一些映射。当每个线程完成时,让它将其id添加到管理器拥有的列表中,然后在管理器中发出一个条件信号。每次经理醒来时,它都可以从列表中取出头,查找适当的线程,读取其作业结果,然后加入线程。请注意,这里的管理器列表将被多个线程访问,因此读/写将需要由互斥保护。
Edit2:,您希望了解更多关于条件的信息,但是您发现的示例没有帮助。我不确定这会不会更好,但这是我写的一些代码。OsSemaphore*函数将条件包装成一个简单的等待/信号API。
发布于 2012-12-14 16:24:17
您需要一个条件变量,与您一直在查看的函数相同,但只需要掉头。等待的条件是“一个工作线程已经完成了一些工作”。
主线程做:
每个工作线程在完成工作时都会:
https://stackoverflow.com/questions/13858333
复制相似问题