首页 > 解决方案 > TryEnterCriticalSection 的用例是什么?

问题描述

自 1990 年代以来,我一直在使用 Windows ,并且自从它首次出现以来CRITICAL_SECTION,我就已经意识到了该功能。TryEnterCriticalSection我知道它应该可以帮助我避免上下文切换等等。

但我突然想到我从未使用过它。不止一次。我也从未觉得我需要使用它。事实上,我想不出我会遇到的情况。

通常,当我需要获得某个东西的排他锁时,我需要那个锁,我现在就需要它。我不能推迟到以后。我当然不能只是说,“哦,好吧,我毕竟不会更新那些数据”。所以我需要EnterCriticalSection,不是TryEnterCriticalSection

那么具体的用例是TryEnterCriticalSection什么?

当然,我已经在 Google 上搜索过了。我找到了很多关于如何使用它的快速描述,但几乎没有真实世界的例子来说明为什么。我确实从英特尔那里找到了这个例子,坦率地说并没有太大帮助:

CRITICAL_SECTION cs;

    void threadfoo()
    {
        while(TryEnterCriticalSection(&cs) == FALSE)
        {
             // some useful work
        }

        // Critical Section of Code

        LeaveCriticalSection (&cs);
    }

    // other work
}

在等待锁定时我可以做“一些有用的工作”的场景到底是什么?我很想避免线程争用,但在我的代码中,当我需要关键部分时,我已经被迫做所有“有用的工作”以获得我在共享中更新的值数据(我首先需要关键部分)。

有没有人有一个真实的例子?

标签: winapicritical-section

解决方案


例如,您可能有多个线程,每个线程都会产生大量消息(某种事件),这些消息都需要放在共享队列中。

由于共享队列上的锁会经常发生争用,因此每个线程都可以有一个本地队列,然后,每当TryEnterCriticalSection当前线程的调用成功时,它将其本地队列中的所有内容复制到共享队列中并释放再次CS。


推荐阅读