aJ.*_*aJ. 23 c++ winapi synchronization critical-section
我正在调试一个多线程应用程序,并找到了内部结构CRITICAL_SECTION
.我发现LockSemaphore
CRITICAL_SECTION的数据成员很有趣.
它看起来像是LockSemaphore
一个自动重置事件(顾名思义不是信号量),并且当第一次线程等待Critcal Section
某个其他线程锁定时,操作系统会静默创建此事件.
现在,我想知道关键部分总是更快吗?Event是一个内核对象,每个Critical部分对象都与事件对象相关联,那么Critical Section
与其他内核对象(如Mutex)相比,如何更快?此外,内部事件对象如何实际影响Critical部分的性能?
这是结构CRITICAL_SECTION
:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
Run Code Online (Sandbox Code Playgroud)
Chr*_*isW 37
当他们说一个关键部分是"快"时,他们的意思是"当它还没有被另一个线程锁定时获得一个便宜".
[注意,如果是已经被另一个线程锁定的话,不要紧,几乎与其说它是多么快.]
它之所以快,是因为在进入内核之前,它使用了InterlockedIncrement
其中一个LONG
字段(可能是在LockCount
字段上)的等价物,如果成功,那么它会认为锁是在没有进入内核的情况下获得的.
该InterlockedIncrement
API是我在用户模式认为实现为"LOCK INC"的操作码......换句话说,你可以获取无争议的关键部分没有做任何环过渡到内核在所有.
For*_*ker 26
在性能工作中,很少有东西属于"总是"类别:)如果你自己实现的东西与使用其他原语的操作系统关键部分类似,那么在大多数情况下,这种情况会更慢.
回答问题的最佳方法是进行性能测量.OS对象的执行方式非常依赖于场景.例如,如果争用率较低,则关键部分通常被视为"快速".如果锁定时间小于旋转计数时间,则它们也被认为是快速的.
最重要的是要确定关键部分的争用是否是应用程序中的第一个限制因素.如果没有,那么只需简单地使用一个关键部分,并处理您的应用程序主要瓶颈(或颈部).
如果关键部分性能至关重要,那么您可以考虑以下因素.
总而言之 - 具有锁争用的调优方案可能具有挑战性(但有趣!)工作.专注于测量应用程序性能并了解热路径的位置.在该xperf工具Windows性能工具箱在这里你的朋友:)我们刚刚发布了4.5版本,在Microsoft Windows SDK的Windows 7和.NET Framework 3.5 SP1(ISO在这里,网络安装在这里).你可以在这里找到xperf工具的论坛.V4.5完全支持Win7,Vista,Windows Server 2008 - 所有版本.
归档时间: |
|
查看次数: |
17003 次 |
最近记录: |