c++ - 如何在 Visual Studio 中查看 std::mutex 的锁定线程?

标签 c++ multithreading visual-studio

使用 Windows CRITICAL_SECTION,我可以通过展开变量来查看锁定它的线程:

enter image description here

但是,我似乎无法对 std::mutex 做同样的事情,而是得到了很多无用的值:

enter image description here

有没有不需要修改我的代码的解决方法?

最佳答案

感谢@PeterT 的评论,为各种互斥类型编写了一个可视化工具(位于/Documents/Visual Studio 2017/Visualizers/mutex.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> 

关于c++ - 如何在 Visual Studio 中查看 std::mutex 的锁定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918497/

相关文章:

java - Java Swing 中的 EventQueue.invokeLater

c++ - ISO禁止启动自己类方法的线程?

java - 延迟一段时间后执行任务,如果遇到无限循环则停止它

c++ - 如何在函数 C++ 中返回空指针

c++ - 无法在初始化中转换类型

c++ - 如何处理 KDE5 plasmoid 中第二台显示器的连接?

c++ - 如何导出到我的 mac (C++) 上的 vsproject?

c++ - 如何在 Mac 上用 C++ 显示模态消息框?

c - 为什么 Visual Studio 2012 在未更改源文件时运行自定义构建步骤?

c# - 将方法标记为过时,但同一类中的调用除外