C# 线程基础之 线程同步

线程同步的手段很多
lock 是通过内存索引块 0 1 切换 进行互斥的实现
互斥量 信号量 事件消息 其实意思就是 一个 标记量
通过这个标记 来进行类似的互斥手段

具体方式的分析 代码在后
1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象
2.信号量 SemaphoreSlim 作用 同时访问同一个资源的线程数量 跨程序同步的场景下可以使用 混合模式
3.事件标识 AutoResetEvent 作用 类似lock 通过 waitone 阻塞与 set 通行 但只有一个线程可用标识
4.事件标识 ManualResetEventSlim 通过 set 通行 reset 设置阻塞 wait 阻塞 多个线程可用标识
5.事件标识 CountdownEvent 作用 限制指定次数信号量 达到后通行
6. SpinWait 自选锁 混合模式
7. ReaderWriterLockSlim 读写锁

互斥量 Mutex ReleaseMutex 测试先在项目路径cmd用命令行dotnet run 执行 然后在看断点

class Program
{
   
   
    static void Main(string[] args)
    {
   
   
        const string MutexName = "testMutex";

        using (var m = new Mutex(false, MutexName))
        {
   
   
            if (!m.WaitOne(TimeSpan.FromSeconds(3), false))
            {
   
   
                Console.WriteLine("未捕获到互斥量");
            }
            else
            {
   
   
                Console.WriteLine("执行逻辑");
                Console.ReadLine();
                //释放互斥量
                m.ReleaseMutex();
            }
        }
    }
}

在这里插入图片描述

信号量 SemaphoreSlim 设置数量为4 循环中执行3次 主线程执行一次 发现主线程没执行
必须释放信号量 才可以 满足 最大执行数保存在4以内

class Program
{
   
   
    static void Main(string[] args)
    {
   
   
        for (int i = 1; i <= 3; i++)
        {
   
   
            string threadName = "Thread " + i;
            var t = new Thread(() => SemaphoreS(threadName, 2));
            t.Start();
        }
        var t1 = new Thread(() => SemaphoreS("4", 2));
        t1.Start();
    }

    static SemaphoreSlim _semaphore = new SemaphoreSlim(3);

    static void SemaphoreS(string name, int seconds)
    {
   
   
        Console.WriteLine("{0} 开始", name);
        _semaphore.Wait();
        Console.WriteLine("{0} 执行", name);
        Thread.Sleep(TimeSpan.FromSeconds(seconds));
        Console.WriteLine("{0} 完成", name);
        //释放信号量
        //_semaphore.Release();

    }
}

在这里插入图片描述

AutoResetEvent 设置俩个 事件标识 通过set 畅通信号 waitone 阻塞信号
于是可以看到 子线程1》主线程2》子线程2 =子线程3》主线程3

class Program
{
   
   
    static void Main(string[] args)
    {
   
   
        var t = new Thread(() => Process());
        t.Start()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值