持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
深入理解.Net中的线程同步之构造模式(二)内核模式构造
@TOC
前言
Kernel-mode Constructs一般翻译为内核模式构造 , Constructs 即是一个名词也是一个动词,但是翻译为构造感觉有点像一个动词,个人感觉翻译为名词更好,毕竟是加了s的,就表示多个,动词显然不能表示多个啊,比如内核模式构造物,内核模式构造体。
环境说明
IDE:Visual Studio 2022 OS:Win10 .NET:.Net4.6.1
一、内核模式构造是什么?
内核模式构体造简单的来说就是由Windows内核为我们的提供的一些方法 参数 变量来同步线程,这些构造和window系统密切相关。内核构造虽然相对去用户模式的构造要慢一点,但是不会产生疯狂的自旋,占用CPU资源。 事件和信号量是两种常见的内核构造物。
二、代码编写
1.编写一个基于event的锁
代码如下(示例):
public sealed class EventLock : IDisposable
{
private readonly AutoResetEvent m_available;
public EventLock()
{
m_available = new AutoResetEvent(true); // Initially free
}
public void Enter()
{
// Block in kernel until resource available
m_available.WaitOne();
}
public void Leave()
{
// Let another thread access the resource
m_available.Set();
}
public void Dispose()
{
m_available.Dispose();
}
}
2.测试锁的效果
代码如下(示例):
public sealed class EventLock : IDisposable
{
private readonly AutoResetEvent m_available;
public EventLock()
{
m_available = new AutoResetEvent(true); // Initially free
}
public void Enter()
{
// Block in kernel until resource available
m_available.WaitOne();
}
public void Leave()
{
// Let another thread access the resource
m_available.Set();
}
public void Dispose()
{
m_available.Dispose();
}
}
效果如下,红色表示没有加锁,绿色代表已经加锁。
总结
可以看出加上了事件锁后,确实能保证输出的顺序,而没有加锁的数据是乱序,甚至可能出行脏数据的情况。