首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个线程同步到一个线程?

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

Stack Overflow用户
提问于 2014-09-09 16:02:27
回答 1查看 84关注 0票数 0

我有一个多线程应用程序,在该应用程序中,除了一个线程之外,所有线程都可以同步运行。然而,当一个特定的线程醒来时,我需要其余的线程来阻塞。

我目前的实现是:

代码语言:javascript
复制
void ManyBackgroundThreadsDoingWork()
{
    AquireMutex(mutex);

    DoTheBackgroundWork();

    ReleaseTheMutex(mutex);
}


void MainThread()
{
    AquireMutex(mutex);

    DoTheMainThreadWork();

    ReleaseTheMutex(mutex);
}

这是可行的,因为它确实防止后台线程在关键块内操作,而主线程正在执行它的工作。然而,即使后台线程不一定需要互斥线程,也有很多关于互斥的争论。主线程间歇性地运行,后台线程能够彼此并发运行,而不是与主线程一起运行。

我所做的是将多线程架构简化为使用锁的单线程架构.这太傻了。我真正想要的是一个大多数时候都是多线程的体系结构,但是当一个小的操作完成之后,它又回到了多线程的状态。

编辑:对问题的解释。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-09 16:21:30

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25749249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档