我有一个多线程应用程序,在该应用程序中,除了一个线程之外,所有线程都可以同步运行。然而,当一个特定的线程醒来时,我需要其余的线程来阻塞。
我目前的实现是:
void ManyBackgroundThreadsDoingWork()
{
AquireMutex(mutex);
DoTheBackgroundWork();
ReleaseTheMutex(mutex);
}
void MainThread()
{
AquireMutex(mutex);
DoTheMainThreadWork();
ReleaseTheMutex(mutex);
}这是可行的,因为它确实防止后台线程在关键块内操作,而主线程正在执行它的工作。然而,即使后台线程不一定需要互斥线程,也有很多关于互斥的争论。主线程间歇性地运行,后台线程能够彼此并发运行,而不是与主线程一起运行。
我所做的是将多线程架构简化为使用锁的单线程架构.这太傻了。我真正想要的是一个大多数时候都是多线程的体系结构,但是当一个小的操作完成之后,它又回到了多线程的状态。
编辑:对问题的解释。
我所拥有的是一个应用程序,显示来自pcie捕捉卡的多个视频提要。pcie捕获卡驱动程序在它管理的线程上发出回调,这些线程实际上是ManyBackgroundThreadsDoingWork函数。在这个函数中,我将捕获的视频帧复制到缓冲区中进行呈现。主线程是间歇运行的呈现线程。复制线程需要阻止在渲染期间,以防止撕裂视频。
我最初的方法是简单地进行双缓冲,但这并不是一个真正的选择,因为捕获卡驱动程序不允许我在不通过系统内存的情况下缓冲帧。这项技术被称为"DirectGMA“,它允许捕获卡将视频帧直接推到GPU内存中。同步的唯一方法是在实际呈现周围放置一个glFence和互斥,因为捕获卡将连续地将数据流到GPU内存。驱动程序不提供帧传输何时完成的指示。回调提供了足够的信息让我知道帧已经准备好要传输了,此时我触发了传输。但是,我需要阻止在场景渲染过程中的传输,以防止视频中的撕裂和人工制品。上述技术是pcie卡制造商建议的技术。然而,当你想一次播放多个视频时,这种技术就会崩溃。因此,这个问题。
发布于 2014-09-09 16:21:30
您需要一个同时支持共享和独占锁定模式的锁,有时称为读写器锁。这允许多个线程获得读(共享)锁,直到一个线程请求独占(写)锁为止。
https://stackoverflow.com/questions/25749249
复制相似问题