虽然这个问题更多的是关于体系结构的,但我考虑的是POSIX的实现。
我从一个更新循环开始,它有几个主要任务要做。我可以将这些作业分成四到五个具有共同内存访问要求的主要任务。我的想法是把这些任务分解成它们自己的线程,让它们完成一个“更新”周期,然后一直睡到下一个帧。
但是如何同步呢?如果我在每个循环开始时分离四或五个线程,让它们运行一次,死掉,然后在每一个循环中分离另一个4-5个线程?听起来很贵。
创建这些线程一次,并让它们进入休眠状态,直到同步调用将其唤醒,听起来更合理。
这是明智的做法吗?我愿意接受来自任何类型的实现的想法的回应。
编辑:根据目前的答案,我想补充如下:
发布于 2010-12-09 21:51:03
如果每个周期都有相同的工作要做,并且需要等待所有的工作在下一个周期开始之前完成,那么您正在考虑正确的解决方案。
您需要一些同步对象:“框架信号量的开始”、“帧信号量的结束”和“框架事件的结束”。如果每个帧都有n个独立的任务,那么启动n个线程,循环如下(伪代码):
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"然后可以运行控制器线程:
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如果您需要完成每个周期的任务数量很大,那么您可能需要使用一个线程池和一个任务队列,这样您就不会用线程淹没系统。但是这个解决方案有更多的复杂性,而线程复杂性则是敌人。
发布于 2010-12-09 21:18:23
这取决于线程正在执行的任务的粒度。如果它们正在执行长任务(例如,秒或更长的任务),那么与线程所做的工作相比,创建和销毁线程的成本可以忽略不计,所以我建议保持简单并根据需要创建线程。
相反,如果您有非常短的任务(例如,少于10-100毫秒),您肯定会开始注意到创建和销毁大量线程的成本。在这种情况下,是的,您应该只创建线程一次,并让他们睡觉,直到他们的工作到来。您需要为此使用某种类型的条件变量 (例如,pthread_cond_t):线程等待条件变量,当工作到达时,向条件变量发出信号。
发布于 2010-12-09 20:56:00
最好的方法可能是使用任务队列。
任务队列可以看作是等待向其提交作业的线程。如果同时发送的多个,则按FIFO顺序执行。
这样,您就可以维护4-5个线程,并且每个线程都执行您提供给它们的作业,而不需要为每个作业分离一个新线程。
唯一的问题是,我不知道C中任务队列的很多实现,苹果有大中央调度( Grand )就是这样做的;FreeBSD也有它的实现。除了那些,我不知道其他的。(不过,我看上去不太认真。)
https://stackoverflow.com/questions/4402990
复制相似问题