std::mutex (互斥量内部实现SRWLOCK)

注意:mutex windows vista 以上系统用SRWLOCK 实现,winxp用的是参考 rtlocks.cpp 
critical_section  调用InterlockedCompareExchangePointer 来实现的 



Windows 7下  + vs2015 微软最新c++11  std::mutex 内部实现剖析

一、	先说说微软c++11 里面实现的代码,废话不多说,上例子验证猜想
Vs2015新建一个控制台程序,代码如下:
// mutex_d.cpp : 定义应用程序的入口点。
//此段代码是死锁程序,方便跳转到内部实现!!!!
#include "stdafx.h"
#include "mutex_d.h"
#include<thread>
#include<mutex>
#include<iostream>

std::mutex test;


void t_fun()
{
	test.lock();//重入导致死锁
	std::cout << "hello\n";
	test.unlock();
}

int main(int argc, TCHAR* argv[])
{
	test.lock();
	std::thread th(t_fun);
	th.join();

	return 0;
}

/*
读写锁 SRWLOCK 使用方法

SRWLOCK srw;

InitializeSRWLock(&srw);
//一旦初始化完成,就可以对写入线程调用AcquireSRWLockExclusive()函数和ReleaseSRWLockExclusive()函数
AcquireSRWLockExclusive(&srw);
//...写入数据,写入东西的时候该线程独占,其他任何线程不可进入
ReleaseSRWLockExclusive(&srw);

//对于只读线程可以调用AcquireSRWLockShared()函数和ReleaseSRWLockShared()函数, 如下
AcquireSRWLockShared(&srw);
//..读取数据,如果这时没有写入数据则多个读取线程可以进行
ReleaseSRWLockShared)&srw);

*/
运行程序会导致卡主不动,此时贴上堆栈:
 
	ntdll.dll!_ZwWaitForKeyedEvent@16 ()	 
 	ntdll.dll!_RtlAcquireSRWLockExclusive@4 ()	 
 	msvcp140d.dll!__crtAcquireSRWLockExclusive(_RTL_SRWLOCK * pLock=0x00ff0388) 行 605	 
 	 	 	 	 	 	msvcp140d.dll!Concurrency::details::stl_critical_section_win7::lock() 行 166	 
 	 msvcp140d.dll!mtx_do_lock(_Mtx_internal_imp_t * mtx=0x00ff0380, const xtime * target=0x00000000) 行 100	 
 	 msvcp140d.dll!_Mtx_lock(_Mtx_internal_imp_t * mtx=0x00ff0380) 行 186	 
 	 mutex_d.exe!std::_Mtx_lockX(_Mtx_internal_imp_t * _Mtx=0x00ff0380) 行 70	 
 	 mutex_d.exe!std::_Mutex_base::lock() 行 43	 
 	 mutex_d.exe!t_fun() 行 16	 
 	 mutex_d.exe!std::_Invoker_functor::_Call<void (__cdecl*)(void)>(void(*)() && _Obj=0x00fe1235) 行 1375	 
 	 mutex_d.exe!std::invoke<void (__cdecl*)(void)>(void(*)() && _Obj=0x00fe1235) 行 1443	 
 	 mutex_d.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void)>,std::default_delete<std::tuple<void (__cdecl*)(void)> > > >::_Execute<0>(std::tuple<void (__cdecl*)(void)> & _Tup={...}, std::integer_sequence<unsigned int,0> __formal={...}) 行 240	 
 	 mutex_d.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void)>,std::default_delete<std::tuple<void (__cdecl*)(void)> > > >::_Run(std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void)>,std::default_delete<std::tuple<void (__cdecl*)(void)> > > > * _Ln=0x0019f5d0) 行 247	 
 	 mutex_d.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void)>,std::default_delete<std::tuple<void (__cdecl*)(void)> > > >::_Go() 行 232	 
 	 mutex_d.exe!std::_Pad::_Call_func(void * _Data=0x0019f5d0) 行 209	 
 	ucrtbased.dll!invoke_thread_procedure(unsigned int(__stdcall*)(void *) procedure=0x00fe11c2, void * const context=0x0019f5d0) 行 92	 
 	 ucrtbased.dll!thread_start<unsigned int (__stdcall*)(void *)>(void * const parameter=0x005fdd50) 行 115	 
 	 kernel32.dll!@BaseThreadInitThunk@12 ()	 
 	 ntdll.dll!___RtlUserThreadStart@8 ()	 
 	 ntdll.dll!__RtlUserThreadStart@8 ()	


注意:如下三个函数其实是一样的!!!!!
{
    Kernel32.dll !AcquireSRWLockExclusive( PSRWLOCK SRWLock
	ntdll.dll!_RtlAcquireSRWLockExclusive@4 ()	 
 	msvcp140d.dll!__crtAcquireSRWLockExclusive(_RTL_SRWLOCK * SRWLock)
}
结论 windows下  std:: mutex内部使用了读写锁SRWLOCK 和 临界区相似的功能!!
源码位置:
Microsoft Visual Studio 14.0\VC\crt\src\stl\primitives.h
virtual void lock() override
        {
            __crtAcquireSRWLockExclusive(&m_srw_lock);
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章