首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制并发线程的数量(使用p线程)

问限制并发线程的数量(使用p线程)
EN

Stack Overflow用户
提问于 2012-12-13 10:56:21
回答 3查看 2.4K关注 0票数 4

我必须编写一个C应用程序,它使用CURL在web上发布信息。应用程序最多只能并行地运行N个请求(比方说10个请求)。如何才能等待任何线程完成,而不是使用pthread_join()的特定线程。

我读过关于pthread_cond_wait的文章,但大多数例子是控制线程(main)如何唤醒工作线程。我需要的只是相反的-工作线程必须能够信号/唤醒父线程之前退出。

更新:实际上,我需要一种让管理线程休眠的方法,当一个工作线程完成它的任务时,它应该唤醒管理线程,给它另一个任务。如果线程结束并为作业创建新线程或使用线程池,这并不重要。萨尔仍然需要一种向经理暗示一项工作已经完成的方式。

,我希望我没有得到这个建议,

代码语言:javascript
复制
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);
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-15 03:01:31

条件变量是你想要的。它们可以很容易地用于从工作线程发出管理线程的信号,反之亦然。

最后的草莓例子实际上非常类似于使用条件变量所能做的事情:

代码语言:javascript
复制
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);

当线程完成时,它只需执行以下操作:

代码语言:javascript
复制
pthread_mutex_lock(&mutex);
threads[self] = IDLE_STATE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
票数 1
EN

Stack Overflow用户

发布于 2012-12-13 11:02:52

与按需创建/销毁线程相比,在启动时创建一个由10个工作线程组成的池,并让您的主程序将作业提供给它们,会更容易。

在启动时,您将创建一个由10名员工组成的数组。这些可能看起来像

代码语言:javascript
复制
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。

票数 4
EN

Stack Overflow用户

发布于 2012-12-14 16:24:17

您需要一个条件变量,与您一直在查看的函数相同,但只需要掉头。等待的条件是“一个工作线程已经完成了一些工作”。

主线程做:

  • 锁互斥
  • 当没有线程完成时: pthread_cond_wait
  • 解锁互斥
  • 排程工作
  • 循环播放

每个工作线程在完成工作时都会:

  • 锁互斥
  • 标记完成
  • pthread_cond_signal
  • 解锁互斥
  • 离开或等待工作
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13858333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档