Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 有趣的线程同步问题_Multithreading_Qt4_Synchronization_Pthreads - Fatal编程技术网

Multithreading 有趣的线程同步问题

Multithreading 有趣的线程同步问题,multithreading,qt4,synchronization,pthreads,Multithreading,Qt4,Synchronization,Pthreads,我正在尝试为以下场景提供一个同步模型: 我有一个GUI线程,负责CPU密集型动画+阻塞I/O。GUI线程从网络检索图像(将它们放入共享缓冲区),处理这些图像(CPU密集型操作..由工作线程完成),然后对这些图像进行动画处理(同样,CPU密集型..由GUI线程完成) 图像的处理由工作线程完成。它从共享缓冲区检索图像,处理图像并将其放入输出缓冲区 只有一次CPU和GUI线程在设置图像动画时不应被调度(动画必须非常平滑)。这意味着只有当GUI线程等待I/O操作完成时,工作线程才应该获得CPU 我该如何

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

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

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

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

我该如何实现这一目标?这看起来像是一个典型的生产者-消费者问题……但我不太确定如何保证动画尽可能平滑(我愿意使用更多线程)

< P>我想使用QTramework(Qt框架)来实现平台无关性,但是我可以考虑pPuthon来进行更多的控制(目前我们只针对Linux)。 有什么想法吗

编辑:


我想问题归结为一件事..如何确保动画线程在设置图像动画时不会中断(当用户从一个页面转到另一个页面时动画会运行..新页面中的所有图像在显示到正确位置之前都会设置动画..这是一个小操作,但必须非常平滑)。工作线程只能在动画结束时运行。

在这里大声思考,但听起来您有两个计算密集型任务,
动画
处理
,并且希望
动画
始终优先于
处理
。如果这是正确的,那么您可以使用一个线程来处理
动画
处理
,而不是将这些任务放在单独的线程中


例如,线程可以有两个任务队列,一个用于
动画
作业,一个用于
处理
作业,并且只有当
动画
队列为空时,它才会从
处理
队列启动作业。但是,只有当每个
处理
作业相对较小且/或在任意位置可中断时(否则
动画
作业将延迟,这不是您想要的),这才可以很好地工作

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

看看解决问题和解决问题的其他方法。如果您坚持使用纯Qt代码,并且不依赖第三方库,那么这些技术将非常有用。如果您必须使用执行阻塞调用的第三方库,那么当然可以使用线程

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

也看看

我的建议是从没有线程开始,看看结果如何。之后,您始终可以重构到线程。因此,最好的方法是设计对象/体系结构,而不需要太多耦合


如果你想,你可以发布一些代码来提供更多的上下文。

true…动画作业应该具有更高的优先级…我如何保证这一点…处理作业不小…因此我不能有一个单线程。另一个问题是i/O…在单线程实现中,我不能利用i/O延迟来处理我已有的图像…嗯,保证处理作业在动画作业运行时不会启动相当简单。一个标准的锁/信号模式就可以了。在动画作业开始时终止/暂停正在进行的处理作业要复杂得多。在较高级别上,您需要一种向处理线程传递消息的方法,该消息表示“动画正在启动”,然后在内部,处理线程需要尽可能减少(或停止)其资源消耗,直到动画停止。我不确定是否有现成的解决方案。提到的QT文章非常好,阅读后我会更好地判断……谢谢!。。这本书是新的,我也会检查一下的!提示:如果您可以使用Qt实现网络,那么如果您不想在CPU上扩展,您可能会避免线程。如果不是,线程是唯一的答案,在web上甚至在qt示例中都有很多示例。我们需要更多关于您的项目的信息来提供具体建议。只涉及一个CPU,因此扩展不是目标…这就是整个项目的灵感所在。。。。我的用例也是一样。另一个没有线程的例子是第7章“使用Qt4进行C++GUI编程,第二版”。事件处理>在密集处理期间保持响应。然后是第14章的一篇好文章。多线程>与主线程通信。