Ben*_*min 3 windows winapi mutex system critical-section
CRITICAL_SECTION锁定(进入)和解锁(离开)是有效的,因为CS测试是在用户空间中执行的,而不会进行互斥锁所做的内核系统调用.解锁完全在用户空间中执行,而ReleaseMutex需要系统调用.
我刚读完这本书中的这些句子.
内核系统调用的意思是什么?你能给我这个功能的名字吗?
我是英国新手.我这样解释他们.
另一个问题.
多年来,Windows中关键部分的实现已发生变化,但它始终是用户模式和内核调用的组合.
CRITICAL_SECTION是一个结构,包含用户模式更新值,内核模式对象的句柄 - EVENT或类似的东西,以及调试信息.
EnterCriticalSection使用互锁的测试和设置操作来获取锁定.如果成功,这就是所需要的(几乎,它也会更新所有者线程).如果set-and-set操作无法获取,则使用更长的路径,这通常需要在内核对象上等待WaitForSignleObject.如果使用InitializeCriticalSectionAndSpinCountthen 初始化,则EnterCriticalSection可以在用户模式下使用互锁操作旋转重试以获取.
下面是EnterCriticialSectionWindows 7(64位)中"快速"/无竞争路径的反汇编,其中包含一些内联注释
0:000> u rtlentercriticalsection rtlentercriticalsection+35
ntdll!RtlEnterCriticalSection:
00000000`77ae2fc0 fff3 push rbx
00000000`77ae2fc2 4883ec20 sub rsp,20h
; RCX points to the critical section rcx+8 is the LockCount
00000000`77ae2fc6 f00fba710800 lock btr dword ptr [rcx+8],0
00000000`77ae2fcc 488bd9 mov rbx,rcx
00000000`77ae2fcf 0f83e9b1ffff jae ntdll!RtlEnterCriticalSection+0x31 (00000000`77ade1be)
; got the critical section - update the owner thread and recursion count
00000000`77ae2fd5 65488b042530000000 mov rax,qword ptr gs:[30h]
00000000`77ae2fde 488b4848 mov rcx,qword ptr [rax+48h]
00000000`77ae2fe2 c7430c01000000 mov dword ptr [rbx+0Ch],1
00000000`77ae2fe9 33c0 xor eax,eax
00000000`77ae2feb 48894b10 mov qword ptr [rbx+10h],rcx
00000000`77ae2fef 4883c420 add rsp,20h
00000000`77ae2ff3 5b pop rbx
00000000`77ae2ff4 c3 ret
Run Code Online (Sandbox Code Playgroud)
所以最重要的是,如果线程不需要阻塞,它将不会使用系统调用,只是一个互锁的测试和设置操作.如果需要阻止,则会进行系统调用.释放路径还使用互锁的测试和设置,如果其他线程被阻止,则可能需要系统调用.
与此相比,互斥总是需要一个系统调用NtWaitForSingleObject和NtReleaseMutant