有趣的线程同步问题

时间:2011-03-20 10:16:36

标签: multithreading qt4 synchronization pthreads

我正在尝试为以下场景提出同步模型:

我有一个GUI线程负责CPU密集型动画+阻止I / O. GUI线程从网络中检索图像(将它们放在共享缓冲区中),这些图像被处理(CPU密集型操作......由工作线程完成),然后这些图像被动画化(再次由CPU线程进行CPU密集...) )。

图像处理由工作线程完成。从共享缓冲区中检索图像处理它们并将它们放入输出缓冲区。

只有一次CPU和GUI线程在动画图像时不应该被调度(动画必须非常流畅)。这意味着只有在GUI线程等待I / O操作完成时,工作线程才能获得CPU。

我如何实现这一目标?这看起来像是一个经典的制作人消费者问题...但我不太确定如何保证动画尽可能顺畅(我愿意使用更多线程)。

我想使用QThreads(Qt框架)来实现平台独立性,但我可以考虑使用pthreads来实现更多控制(目前我们只针对linux)。

有什么想法吗?

编辑:

我猜这些问题归结为一件事。我确保动画线程在动画图像时不会被中断(动画在用户从一个页面转到另一个页面时运行。所有图像在新页面中显示动画,然后在适当的位置显示..这是一个小操作,但它必须非常流畅)。工作线程只能在动画结束时运行..

2 个答案:

答案 0 :(得分:1)

在这里大声思考,但听起来你有两个计算密集型任务animationprocessing,并且你希望animation始终优先于processing }。如果这是正确的,那么可能没有将这些任务放在单独的线程中,您可以拥有一个处理animationprocessing的线程。

例如,该线程可以有两个任务队列,一个用于animation个作业,一个用于processing个作业,它只在processing队列中启动animation队列时的作业{1}}队列为空。但是,只有当每个processing工作在任意位置相对较小和/或可中断时,这才能正常工作(否则animation工作将被延迟,这不是您想要的。

答案 1 :(得分:1)

第一个大问题是:我真的需要线程吗? Qt的事件系统和网络对象使得没有线程的技术负担以及随之而来的所有障碍变得容易。

了解解决问题的其他方法herehere。如果您坚持纯Qt代码并且不依赖于第三方库,这些技术很棒。如果你必须使用阻止调用的第三方库,那么你可以使用线程。

Here是消费者生产者的一个例子。

另请查看Advanced Qt Programming: Creating Great Software with C++ and Qt 4

我的建议是在没有线程的情况下开始,看看它是如何运作的。您可以随后重构线程。因此,最好是在没有太多耦合的情况下设计对象/架构。

如果您愿意,可以发布一些代码以提供更多背景信息。