首页 > 其他分享 >多线程 互斥锁与读写锁 概念

多线程 互斥锁与读写锁 概念

时间:2023-03-29 11:34:12浏览次数:42  
标签:Task 写锁 读写 rwl 互斥 读锁 线程 多线程

一、多线程 lock 互斥锁

简述

多线程环境中,不使用lock锁,会形成竞争条件,导致A线程与B线程数据使用冲突。
使用lock锁可以保证当有线程操作某个共享资源时,能使该代码块按照指定的顺序执行,其他线程必须等待直到当前线程完成操作。
即是多线程环境,如果一个线程锁定了共享资源,需要访问该资源的其他线程则会处于阻塞状态,并等待直到该共享资源接触锁定。

    private static object Lock = new object();
    static private ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
    private int a = 0;
    async void Start()
    {
        for(int i = 0; i < 100000; i++)
        {
           _ = GetA();
        }
       await UniTask.Delay(5000);
        Debug.Log("A = " + a);
    }

    async Task GetA()
    {
        //独立线程运行
        await Task.Run(() =>
        {
            //加 lock 加锁后后面则等待 上一个线程使用完毕后解锁+=1
            //lock(Lock)
            //{
            //    a += 1;
            //}

            //不加Lock 执行 可能会出现2个线程同时100+=1 
            a += 1;
        });
    }

二、多线程 读写锁

简述

多线程读写锁是一种并发控制机制,用于处理多个线程同时读取共享数据和写入共享数据的情况。该机制允许多个线程同时读取共享数据,但只允许一个线程写入共享数据。这可以提高程序的并发性和性能。

读写锁包含两个锁:读锁和写锁。多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当一个线程持有写锁时,其他线程无法获取读锁或写锁。

读写锁的优点在于,当多个线程只读取共享数据时,可以同时获取读锁,从而避免了互斥锁的性能开销。而当一个线程需要写入共享数据时,它必须获取写锁,这会阻塞其他线程的读写操作,从而保证了数据的一致性。

读写锁的缺点在于,当一个线程拥有写锁时,其他线程无法读取或写入共享数据,可能会导致一些线程长时间的等待。此外,由于读写锁需要维护多个锁状态,因此在实现上比互斥锁更复杂。

async Task  GetA()
    {
       
       await Task.Run(() =>
        {
            //当 rwl 进入写锁时 读锁 写锁都需要等待
            rwl.EnterWriteLock();
            Debug.Log(a);
            rwl.ExitWriteLock();
        });
       
    }

     async Task GetB()
    {
        await Task.Run(() =>
        {
           //当 rwl 进入读锁时 写锁需要等待,所有读锁无需等待
            rwl.EnterReadLock();
            Debug.Log(a);
            rwl.ExitReadLock();

        });
    }
    async Task GetC()
    {
        await Task.Run(() =>
        {
            //当 rwl 进入读锁时 写锁需要等待,所有读锁无需等待
            rwl.EnterReadLock();
            Debug.Log(a);
            rwl.ExitReadLock();

        });
    }

标签:Task,写锁,读写,rwl,互斥,读锁,线程,多线程
From: https://www.cnblogs.com/wjc666/p/17268259.html

相关文章

  • LabVIEW Excel工具包快速读写EXCEL样式模板生成测试报告制作
    LabVIEWExcel工具包快速读写EXCEL样式模板生成测试报告制作YID:86199673187774245......
  • 多线程socketserver
    模块:socketservertcp协议:服务端:importsocketserverclassMyRequestHandle(socketserver.BaseRequestHandler):defhandle(self):#print(self.request)#......
  • 【面试专栏】Java创建多线程的五种方式
    1.继承Thread类importlombok.extern.slf4j.Slf4j;importorg.junit.jupiter.api.Test;/***继承Thread类创建多线程单元测试**@authorCL*/@Slf4jpublic......
  • c++14 读写锁
    读的时候用共享锁,写的时候用独占锁structotherSettingModel{inlinestaticconstchar*jsonFileSavePath="../data/otherSettingModel.json";inlinesta......
  • C#:多线程操作Dictionary
    为了在多线程环境下操作Dictionary,我们需要确保线程安全。其中一种实现方式是使用ConcurrentDictionary类,该类位于System.Collections.Concurrent命名空间中。Concurrent......
  • 多线程 wait() notify的用法
    main类 packageendual;publicclassMainApp{ publicstaticvoidmain(String[]args){ Queryq=newQuery(0); Threadthread=newThread(newThrea......
  • 多线程——生产者和消费者(等待唤醒机制)
    生产者和消费者(等待唤醒机制)生产者消费者模式是一个十分经典的多线程协作的模式举例:   实现方式一: 线程的方法代码编写技巧,如run():步骤:(1)循环;(2)同步代码块;(3)判断......
  • android实现多线程基础
    //创建线程类classMythreadextendsThread{@Overridepublicvoidrun(){//定义行为}}//实例化线程类MyThreadmt=newMyThread(“线程名称”);///......
  • 多线程中常见的成员方法
     MyThreadt=newMyThread();1、StringgetName()细节:如果没有给线程设置名字,线程也是有默认的名字的格式:Thread-X(X序号,从0开始)2、voidsetName(Stringname)细......
  • 多线程
    1、概念线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。进程:进程是程序的基本执行实体。多线程:有了多线程,就可以让程序同......