directshow cbaserender线程安全吗?

Is directshow CBaseRenderer thread safe?

本文关键字:安全 线程 cbaserender directshow      更新时间:2023-10-16

我正在使用一个简单的directshow过滤器,该过滤器派生自directshow基类中的CBaseRenderer,并且我在这个类中得到死锁。

我有一个很好的谷歌,并发现有人有完全相同的问题(在停止中的InterfaceLockReceive中的RendererLock之间出现死锁),但他没有得到任何响应,这表明这是一个罕见的情况,他和我已经在我们的代码中(而不是在ms基类中的错误)。

那么,其他人看到这个问题了吗?我应该从CBaseRenderer导出我的过滤器(它不做那么多TBH)还是直接到CBaseFilter/CBaseInputPin类?如果我要重写WaitForReceiveToComplete,我应该在里面放什么?

我将回到基础并查看转储示例过滤器,但我仍然对有使用CBaseRenderer经验的人的反应感兴趣。

我想问题可能是围绕这个循环在baseclass renbase.cpp:

void CBaseRenderer::WaitForReceiveToComplete()
{
    // NOTE: m_InterfaceLock is locked higher on the call stack
    for (;;) {
        if (!m_bInReceive) {
            break;
        }
        MSG msg;
        //  Receive all interthread snedmessages
        PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_NOREMOVE);
        // TODO: Unlock m_InterfaceLock until the end of the loop 
        Sleep(1);
    }

上面的注释解释了这个问题——一个无限循环可能会占用一个试图进入m_InterfaceLock的并发线程。

如果是这种情况,睡觉时不锁定可能会有机会突破。