C++ 如何在VisualStudio中查看std::mutex的锁定线程?

C++ 如何在VisualStudio中查看std::mutex的锁定线程?,c++,multithreading,visual-studio,C++,Multithreading,Visual Studio,使用WindowsCRITICAL\u SECTION,我可以看到通过展开变量锁定它的线程: 然而,我似乎不能对std::mutex做同样的处理,而是得到了很多无用的值: 有没有一种方法不需要修改我的代码?感谢@PeterT的评论,为各种互斥类型编写了一个可视化工具(放在/Documents/visualstudio 2017/Visualizers/mutex.natvis中): *(长*)((字符*)&;_Mtx_存储+sizeof(_Mtx_存储)-8) *(int*)((ch

使用Windows
CRITICAL\u SECTION
,我可以看到通过展开变量锁定它的线程:

然而,我似乎不能对std::mutex做同样的处理,而是得到了很多无用的值:


有没有一种方法不需要修改我的代码?

感谢@PeterT的评论,为各种互斥类型编写了一个可视化工具(放在/Documents/visualstudio 2017/Visualizers/mutex.natvis中):


*(长*)((字符*)&;_Mtx_存储+sizeof(_Mtx_存储)-8)
*(int*)((char*)&;_Mtx_存储+sizeof(_Mtx_存储)-4)
互斥
(_Mutex_base*)此
定时互斥
_我的钥匙锁上了
递归互斥
(_Mutex_base*)此
递归\u定时\u互斥
_我的钥匙锁上了
_我的主人

尝试将值强制转换为
\u Mtx\u internal\u imp\t*
我尝试过,但我在哪里可以找到它里面的内容?它似乎没有在公共资源的任何地方定义。这是否意味着即使知道内部细节,我也找不到锁定线程?在调试多线程应用程序时,这似乎是一个主要障碍。@riv-nah,它使用SRWLock进行锁定,但它还额外存储了threadid,您可以在
\crt\src\stl\mutex.c
中看到它,谢谢您解决了这个问题。下次遇到这个问题时,我可以把它放在natvis里。
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::_Mutex_base">
    <Expand>
      <Item Name="[thread_id]">*(long*)((char*)&amp;_Mtx_storage+sizeof(_Mtx_storage)-8)</Item>
      <Item Name="[count]">*(int*)((char*)&amp;_Mtx_storage+sizeof(_Mtx_storage)-4)</Item>
    </Expand>    
  </Type>
  <Type Name="std::mutex">
    <DisplayString>mutex</DisplayString>
    <Expand>
      <ExpandedItem>(_Mutex_base*)this</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="std::timed_mutex">
    <DisplayString>timed_mutex</DisplayString>
    <Expand>
      <Item Name="[locked]">_My_locked</Item>
    </Expand>
  </Type>
  <Type Name="std::recursive_mutex">
    <DisplayString>recursive_mutex</DisplayString>
    <Expand>
      <ExpandedItem>(_Mutex_base*)this</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="std::recursive_timed_mutex">
    <DisplayString>recursive_timed_mutex</DisplayString>
    <Expand>
      <Item Name="[locked]">_My_locked</Item>
      <Item Name="[owner]">_My_owner</Item>
    </Expand>
  </Type>
</AutoVisualizer>