首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置和管理持久多线程?

如何设置和管理持久多线程?
EN

Stack Overflow用户
提问于 2010-12-09 20:51:48
回答 4查看 215关注 0票数 1

虽然这个问题更多的是关于体系结构的,但我考虑的是POSIX的实现。

我从一个更新循环开始,它有几个主要任务要做。我可以将这些作业分成四到五个具有共同内存访问要求的主要任务。我的想法是把这些任务分解成它们自己的线程,让它们完成一个“更新”周期,然后一直睡到下一个帧。

但是如何同步呢?如果我在每个循环开始时分离四或五个线程,让它们运行一次,死掉,然后在每一个循环中分离另一个4-5个线程?听起来很贵。

创建这些线程一次,并让它们进入休眠状态,直到同步调用将其唤醒,听起来更合理。

这是明智的做法吗?我愿意接受来自任何类型的实现的想法的回应。

编辑:根据目前的答案,我想补充如下:

  • 需要并发性
  • 这些工作线程打算在很短的时间内运行<250 to
  • 每个线程所做的工作总是相同的。
  • 我在考虑4-5个线程,20个线程是一个很难的限制。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-09 21:51:03

如果每个周期都有相同的工作要做,并且需要等待所有的工作在下一个周期开始之前完成,那么您正在考虑正确的解决方案。

您需要一些同步对象:“框架信号量的开始”、“帧信号量的结束”和“框架事件的结束”。如果每个帧都有n个独立的任务,那么启动n个线程,循环如下(伪代码):

代码语言:javascript
运行
复制
while true:
  wait on "start of frame semaphore"
  <do work>
  enter lock
  decrement "worker count"
  if "worker count" = 0 then set "end of frame event"
  release lock
  wait on "end of frame semaphore"

然后可以运行控制器线程:

代码语言:javascript
运行
复制
while true:
  set "worker count" to n
  increment "start of frame semaphore" by n
  wait on "end of frame event"   
  increment "end of frame semaphore" by n

如果您需要完成每个周期的任务数量很大,那么您可能需要使用一个线程池和一个任务队列,这样您就不会用线程淹没系统。但是这个解决方案有更多的复杂性,而线程复杂性则是敌人。

票数 1
EN

Stack Overflow用户

发布于 2010-12-09 21:18:23

这取决于线程正在执行的任务的粒度。如果它们正在执行长任务(例如,秒或更长的任务),那么与线程所做的工作相比,创建和销毁线程的成本可以忽略不计,所以我建议保持简单并根据需要创建线程。

相反,如果您有非常短的任务(例如,少于10-100毫秒),您肯定会开始注意到创建和销毁大量线程的成本。在这种情况下,是的,您应该只创建线程一次,并让他们睡觉,直到他们的工作到来。您需要为此使用某种类型的条件变量 (例如,pthread_cond_t):线程等待条件变量,当工作到达时,向条件变量发出信号。

票数 2
EN

Stack Overflow用户

发布于 2010-12-09 20:56:00

最好的方法可能是使用任务队列。

任务队列可以看作是等待向其提交作业的线程。如果同时发送的多个,则按FIFO顺序执行。

这样,您就可以维护4-5个线程,并且每个线程都执行您提供给它们的作业,而不需要为每个作业分离一个新线程。

唯一的问题是,我不知道C中任务队列的很多实现,苹果有大中央调度( Grand )就是这样做的;FreeBSD也有它的实现。除了那些,我不知道其他的。(不过,我看上去不太认真。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4402990

复制
相关文章

相似问题

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