`

互斥锁/读写锁

    博客分类:
  • Lock
 
阅读更多

原创转载请注明出处:https://agilestyle.iteye.com/blog/2443637

 

互斥锁

在访问共享资源之前进行加锁操作,在访问完成之后进行解锁操作。加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前线程解锁。如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都会变成就绪状态,第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。在这种方式下,只有一个线程能够访问被互斥锁保护的资源。举个形象的例子:多个人抢一个马桶

 

读写锁

读写锁既是互斥锁,又是共享锁,read模式是共享,write模式是互斥(排他锁),参考JUC包下的ReadWriteLock

读写锁的三种状态:读加锁,写加锁,不加锁

一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。只有一个线程可以

占有写状态的锁,但可以有多个线程同时占有读状态的锁,这就是它可以实现高并发的原因。

当处于写状态锁时,任何想要尝试获得锁的线程都会被阻塞,直到写状态锁被释放

当处于读状态锁时,允许其他线程获得它的读状态锁,但是不允许获得它的写状态锁,直到所有线程的读状态锁被释放。

为来避免想要尝试写操作的线程一直得不到写状态锁而处于线程饥饿,当读写锁感知到有线程想要获得写状态锁时,便会阻塞其后想要获得读状态的线程。所以读写锁非常适合多读少写的情况。

 

 

 

分享到:
评论

相关推荐

    QT/C++11多线程、互斥/读写锁、多生产消费模型

    QT/C++11多线程、互斥/读写锁、多生产消费模型

    C++ 互斥锁源码

    ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    本文将深入探讨标题和描述中提及的各种锁,包括乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁以及行级锁。 1. **乐观锁**:乐观锁假设多线程环境中的冲突较少,所以在读取数据时不加锁,只有...

    linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    - 客户端连接共享内存,获取互斥锁,读写数据,然后释放锁。 - 当数据满足特定条件时,服务端或客户端可以发送信号量通知对方,通过条件变量进行同步。 5. **应用实例**: 在数据库、网络服务器、分布式系统等多...

    Mysql(MyISAM)的读写互斥锁问题的解决方法

    "Mysql(MyISAM)的读写互斥锁问题的解决方法" 在Mysql(MyISAM)中,读写互斥锁问题是常见的性能瓶颈之一。为了解决这个问题,需要了解MyISAM的读写机制和锁机制。MyISAM在读操作占主导的情况下是很高效的,但是一旦...

    在分布式环境中Leader选举互斥锁和读写锁该如何实现

    ### 分布式环境中Leader选举、互斥锁与读写锁的实现 #### 一、Leader选举 在分布式系统中,Leader选举是一种常见的机制,用于在多个节点之间选择一个领导者(Leader)。领导者通常负责协调和管理其他节点的工作。...

    PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    而读写锁(也称为共享-独占锁或共享互斥锁)则允许多个线程同时读取资源,但只有一个线程可以写入资源,这样既提高了并发读取的效率,又保证了数据的一致性。 在PHP中,可以通过sync扩展模块实现互斥锁和读写锁。...

    线程进程互斥锁

    - **文件操作**:在多个线程或进程中,如果需要对同一个文件进行读写操作,使用互斥锁可以防止数据的混乱,确保每次只有一个线程或进程进行读写。 - **全局变量**:当多个线程需要修改全局变量时,互斥锁能确保...

    Java中的锁分类与使用.docx

    3. **互斥锁/读写锁** - **互斥锁**(如ReentrantLock)保证了在同一时间只有一个线程访问资源,防止数据不一致。 - **读写锁**(如ReadWriteLock)进一步细分为读锁和写锁,读锁可被多个线程共享,写锁是独占的,...

    linux无亲缘关系进程间通信(互斥锁+条件变量+共享内存)

    本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...

    用原子自旋读写锁代替互斥锁提高多线程访问公共资源效率

    传统的互斥锁(Mutex)是一种常见的同步机制,它通过让一个线程获得锁并独占资源,其他线程则等待该线程释放锁来实现线程间的同步。然而,在高并发环境下,互斥锁可能会成为性能瓶颈,因为它可能导致线程频繁地上...

    GO语言并发编程之互斥锁、读写锁详解

    这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都是非常常用和重要的。 一、互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准...

    线程互斥锁

    对于大块代码,可以考虑使用读写锁或者自旋锁等更细粒度的同步机制。 总的来说,线程互斥锁是保证多线程环境下数据一致性的重要工具,它的正确使用对于编写可扩展和可靠的并发程序至关重要。通过理解不同操作系统下...

    线程同步与互斥:读写锁示例代码

    Linux系统编程——线程同步与互斥:读写锁,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/46485735

    互斥锁的消息队列,很综合的程序源码

    在这个源码中,很可能使用了互斥锁来保护消息队列的读写操作,确保在任何时候只有一个线程可以对队列进行操作,防止数据的混乱。同时,通过条件变量(Condition Variables),线程可以在特定条件满足时(例如,消息...

    2024秋招and春招-面试基础(1).docx

    - **互斥锁/读写锁**:互斥锁一次只允许一个线程访问资源,读写锁允许多个读取线程或单个写入线程访问。 - **乐观锁/悲观锁**:乐观锁假定冲突少,先执行再验证;悲观锁假设冲突多,先加锁再执行。 - **分段锁/偏向...

    boost库的线程例子和互斥锁

    除了基本的互斥锁,Boost.Thread还提供了其他类型的锁,比如读写锁(`boost::shared_mutex`),允许多个读取者同时访问资源,但写入操作仍保持互斥。还有可取消的锁(`boost::mutex::scoped_lock`),当线程被异常...

    多线程互斥锁和条件变量demo

    在实际的多线程编程中,互斥锁和条件变量的组合使用可以解决复杂的同步问题,例如生产者-消费者模型、读写锁等。通过理解并熟练掌握这些概念,你将能够编写出更加高效、可靠的多线程程序。对于初学者来说,分析并...

    3.线程间同步和通信之互斥锁(动态)

    互斥锁通常应用于需要保证数据一致性的情况,如读写共享变量或执行临界区代码。 **互斥锁的工作原理:** 在RT-Thread中,互斥锁通过一个结构体表示,内部包含一个计数器和等待队列。线程尝试获取锁时,会检查锁的...

Global site tag (gtag.js) - Google Analytics