深入理解.Net中的线程同步之构造模式(二)内核模式构造

持续创作,加速成长!这是我参与「掘金日新计划 · 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(); 
        }
    }

效果如下,红色表示没有加锁,绿色代表已经加锁。

image.png

image.png

总结

可以看出加上了事件锁后,确实能保证输出的顺序,而没有加锁的数据是乱序,甚至可能出行脏数据的情况。

猜你喜欢

转载自juejin.im/post/7112460156654321695