繁体   English   中英

如何将多个线程同步到一个?

[英]How to synchronize multiple threads to one?

我有一个多线程应用程序,我想允许其中一个线程以外的所有线程同步运行。 但是,当特定线程唤醒时,我需要其余线程进行阻塞。

我当前的实现是:

void ManyBackgroundThreadsDoingWork()
{
    AquireMutex(mutex);

    DoTheBackgroundWork();

    ReleaseTheMutex(mutex);
}


void MainThread()
{
    AquireMutex(mutex);

    DoTheMainThreadWork();

    ReleaseTheMutex(mutex);
}

之所以起作用,是因为它确实使后台线程在主线程执行其工作时不会在关键块内运行。 但是,即使后台线程不一定需要互斥锁,也有很多争用。 主线程间歇地运行,而后台线程能够彼此并发运行,而不是与主线程并发运行。

我有效完成的工作是使用锁将多线程体系结构简化为单线程体系结构……这很愚蠢。 我真正想要的是一种大多数情况下都是多线程的体系结构,但是等待一小步操作完成后又回到多线程。

编辑:问题的解释。

我所拥有的应用程序可以显示来自pcie采集卡的多个视频源。 pcie采集卡驱动程序在其管理的线程上发出回调,这些回调实际上是ManyBackgroundThreadsDoingWork函数。 在此功能中,我将捕获的视频帧复制到缓冲区以进行渲染。 主线程是间歇运行的渲染线程。 复制线程需要在渲染期间阻塞,以防止视频撕裂。

我最初的方法是简单地进行双缓冲,但这并不是真正的选择,因为捕获卡驱动程序不允许我缓冲帧而不将帧推入系统内存。 AMD使用的技术称为“ DirectGMA”,它允许采集卡将视频帧直接推入GPU内存。 同步的唯一方法是在实际渲染周围放置glFence和互斥锁,因为捕获卡将不断将数据流传输到GPU内存。 驱动程序不提供帧传输完成时间的指示。 回调提供了足够的信息,让我知道在准备触发传输时已准备好传输帧。 但是,我需要在场景渲染期间阻止传输,以防止视频中的撕裂和伪影。 上述技术是pcie卡制造商建议的技术。 但是,当您一次要播放多个视频时,该技术就会失效。 因此,这个问题。

您需要同时支持共享锁定模式和独占锁定模式的锁,有时也称为读取器/写入器锁 这允许多个线程获得读取(共享)锁,直到一个线程请求排他(写入)锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM