【发布时间】:2014-09-10 00:21:30
【问题描述】:
我有一个多线程应用程序,我希望允许除一个线程之外的所有线程同步运行。但是,当特定线程唤醒时,我需要将其余线程阻塞。
我目前的实现是:
void ManyBackgroundThreadsDoingWork()
{
AquireMutex(mutex);
DoTheBackgroundWork();
ReleaseTheMutex(mutex);
}
void MainThread()
{
AquireMutex(mutex);
DoTheMainThreadWork();
ReleaseTheMutex(mutex);
}
这行得通,因为它确实阻止了后台线程在主线程工作时在关键块内运行。但是,即使后台线程不一定需要互斥锁,也存在很多争用。主线程间断运行,后台线程可以同时运行,只是不能和主线程同时运行。
我有效地做的是使用锁将多线程架构简化为单线程架构......这很愚蠢。我真正想要的是一个大部分时间都是多线程的架构,然后等待一个小操作完成并返回到多线程。
编辑:问题的解释。
我有一个应用程序,它显示来自 pcie 采集卡的多个视频源。 pcie 采集卡驱动程序在它管理的线程上发出回调,实际上是ManyBackgroundThreadsDoingWork 函数。在这个函数中,我将捕获的视频帧复制到缓冲区中进行渲染。主线程是间歇运行的渲染线程。复制线程需要在渲染期间阻塞,以防止视频撕裂。
我最初的方法是简单地进行双缓冲,但这并不是一个真正的选择,因为采集卡驱动程序不允许我在不将帧推入系统内存的情况下缓冲帧。正在使用的技术称为 AMD 的“DirectGMA”,它允许采集卡将视频帧直接推送到 GPU 内存中。同步的唯一方法是在实际渲染周围放置一个 glFence 和互斥锁,因为采集卡将不断地将数据流式传输到 GPU 内存。驱动程序不提供帧传输何时完成的指示。回调提供了足够的信息让我知道帧已准备好传输,此时我触发传输。但是,我需要在场景渲染期间阻止传输,以防止视频中出现撕裂和伪影。上述技术是 pcie 卡制造商建议的技术。但是,当您一次想要播放多个视频时,该技术就会失效。因此,问题。
【问题讨论】:
-
如果你解释你的问题而不是你提出的解决方案,你会得到更好的答案。因为您提出的解决方案听起来不像任何可以想象的问题的明智解决方案。见XY problem。
-
这很公平。我会添加它。
标签: multithreading synchronization