内容简介:Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。如果你不了解这个功能如何使用,那么可以阅读本文。Visual Studio 的官方更新日志中对此功能的描述:
Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。
如果你不了解这个功能如何使用,那么可以阅读本文。
更新日志
Visual Studio 的官方更新日志中对此功能的描述:
View which managed thread is holding a .NET object lock
即“查看托管线程正在持有 .NET 对象锁”。
功能入口
这个功能没有新的入口,你可以在“调用堆栈” (Call Stack) 窗口,“并行堆栈” (Parallel Stacks) 窗口,以及“线程”窗口的位置列中查看哪个托管线程正在持有 .NET 对象锁。
示例
现在我们就实际看一下这个功能的用法和效果。于是我写了一点下面的代码。
static void Main(string[] args)
{
var locker = new object();
Thread thread = new Thread(() =>
{
Console.WriteLine("后台线程尝试获得锁");
lock (locker)
{
Console.WriteLine("后台线程成功获得锁");
}
})
{
Name = "walterlv thread",
};
Console.WriteLine("主线程尝试获得锁");
Monitor.Enter(locker);
Console.WriteLine("主线程成功获得锁");
thread.Start();
}
在这段代码中,主线程获得锁之后直接退出,而新线程“walterlv thread”则尝试获得锁。
现在在 Visual Studio 2019 中运行这段代码,可以看到另一个线程是不可能获得锁的,于是不会输出最后那一句,其他都会输出。
随后我们在 Visual Studio 中点击“全部中断”,也就是那个“暂停”图标的按钮。
打开调用堆栈窗口(在“调试 -> 窗口 -> 调用堆栈”),可以看到堆栈最顶端显示了正在等待锁,并且指出了线程对象。
然后在线程窗口(在“调试 -> 窗口 -> 线程“)的位置列,鼠标移上去可以看到与堆栈中相同的信息。
当然,我们的主线程实际上早已直接退出了,所以正在等待的锁将永远不会释放(除非进程退出)。
同样的信息,在并行堆栈(在“调试 -> 窗口 -> 并行堆栈”)中也能看到。
参考资料
- Visual Studio 2019 version 16.5 Release Notes - Microsoft Docs
- Visual Studio 2019 version 16.5 is now available - Visual Studio Blog
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 关于 Java 单线程经常占用 CPU 100% 的分析
- 原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
- .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
- mariadb 内存占用优化
- MariaDB内存占用优化
- 清理docker占用空间
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Is Parallel Programming Hard, And, If So, What Can You Do About
Paul E. McKenney
The purpose of this book is to help you understand how to program shared-memory parallel machines without risking your sanity.1 By describing the algorithms and designs that have worked well in the pa......一起来看看 《Is Parallel Programming Hard, And, If So, What Can You Do About 》 这本书的介绍吧!