winapi - 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
}
在等待锁定时我可以做“一些有用的工作”的场景到底是什么?我很想避免线程争用,但在我的代码中,当我需要关键部分时,我已经被迫做所有“有用的工作”以获得我在共享中更新的值数据(我首先需要关键部分)。
有没有人有一个真实的例子?
解决方案
例如,您可能有多个线程,每个线程都会产生大量消息(某种事件),这些消息都需要放在共享队列中。
由于共享队列上的锁会经常发生争用,因此每个线程都可以有一个本地队列,然后,每当TryEnterCriticalSection
当前线程的调用成功时,它将其本地队列中的所有内容复制到共享队列中并释放再次CS。
推荐阅读
- json - jq:将对象的json数组输出到带有对象的键数组
- swift - 在 Swift 4+ 中为字典中的各种类型存储一组同质数组的最佳方法是什么?
- javascript - 需要多个提交按钮失败
- azure-active-directory - 清理#AzureAD 和 Microsoft 帐户重叠
- php - php exec 工作与 cli 和 cron 不同
- javascript - 使用javascript干净地强制路由
- python - 使用secondary_y时,情节会发生变化
- javascript - 如何使用节点和电子扫描补丁?
- twilio - 在聚集中减慢 Twilio 文本到语音播放的速度
- javascript - 如何在特定功能运行时停止任何其他功能