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

时间:2014-09-09 16:02:27

标签: multithreading synchronization

我有一个多线程应用程序,我希望允许除一个线程之外的所有线程同步运行。但是,当一个特定的线程被唤醒时,我需要阻止其余的线程。

我目前的实施是:

void ManyBackgroundThreadsDoingWork()
{
    AquireMutex(mutex);

    DoTheBackgroundWork();

    ReleaseTheMutex(mutex);
}


void MainThread()
{
    AquireMutex(mutex);

    DoTheMainThreadWork();

    ReleaseTheMutex(mutex);
}

这是有效的,因为它确实使后台线程在主线程正在工作时保持在关键块内运行。但是,即使不一定需要它们,后台线程中的互斥锁也存在很多争议。主线程间歇运行,后台线程可以相互并发运行,而不是主线程。

我已经有效地完成了将多线程架构简化为使用锁的单线程架构......这很愚蠢。我真正想要的是一个大多数时候都是多线程的架构,但是在一个小的操作完成后等待,然后再回到多线程。

编辑:对问题的解释。

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

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

1 个答案:

答案 0 :(得分:2)

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