首页 > 其他分享 >线程互斥实现方式

线程互斥实现方式

时间:2023-02-26 10:44:18浏览次数:40  
标签:方式 读写 共享资源 互斥 线程 加读 加写

1. 互斥锁

2. 读写硕

3. 线程信号量

 

互斥锁:

  互斥锁的数据类型:pthread_mutex_t

  互斥锁是一种加锁的方法来控制对共享资源的访问。同一时刻只能由一个线程掌握某个互斥锁(就是有一把互斥锁),一个线程对共享资源上锁了,其他线程希望上锁一个已经上了互  斥锁的共享资源,那么这些线程将会阻塞,直到上锁的线程释放互斥锁为止。

  通俗的解释就是:某个线程对共享资源上了某把互斥锁,其他线程想重新用这把互斥锁上锁,那这些线程将会阻塞,直到上锁的线程将这把互斥锁释放为止。

 

互斥锁的创建和销毁:

 

 参数:

  mutex:要创建的那把互斥锁(互斥锁可以创建多把)

  mutexattr:互斥锁创建方式

    

上锁和解锁:

 

互斥锁的整体使用流程:
  1. 创建互斥锁

  2. 对共享资源枷锁

  3. 对共享资源解锁

  4. 释放互斥锁

注意:一把互斥锁就和某个共享资源绑定。如果有多个共享资源,可以定义多把互斥锁。建议不要把互斥锁定义为全局变量。

 

 互斥锁属性创建和销毁:

 互斥锁也有很多属性,和线程一样,都有一个结构来定义这些属性(pthread_mutexattr_t),如进程共享属性、互斥锁的类型

  互斥锁进程共享属性:

     

    

  互斥锁的类型:

    

    

读写硕:

 为什么会用读写硕?

  以为使用互斥锁缺乏读的并发性。即当多个线程对共享资源读时(没有修改共享资源的数据),只有一个线程可以读,其他线程只能阻塞。

  读写锁就能解决这种问题,当读(不修改共享资源数据)操作较多,写(要修改共享资源数据)操作较少时,使用读写锁提高线程的读的并发性。

 读写锁的数据类型:pthread_rwlock_t

 

读写锁也是只有一把锁,但是它有两种属性,读属性和写属性。

当多个线程都对共享资源加了读锁,线程不会阻塞,都能读成功;

当一个线程对共享资源加了读锁,另一个线程又对共享资源加写锁,或者是当一个线程对共享资源加了写锁,另一个线程又对共享资源加读锁,那么加锁就会失败;

当一个线程对共享资源加了写锁,另一个线程又对共享资源加写锁,这样也会失败。

总结:

  第一个线程加读锁,第二个线程也加读锁------》成功

  第一个线程加读锁,第二个线程也加写锁------》加读锁成功,加写锁这个线程会阻塞

  第一个线程加写锁,第二个线程也加读锁------》加写锁成功,加读锁会失败

  第一个线程加写锁,第二个线程也加写锁------》第一次加写锁成功,第二次加写锁失败

读写锁的加锁和解锁:

 

标签:方式,读写,共享资源,互斥,线程,加读,加写
From: https://www.cnblogs.com/zj-studyrecoding/p/17156233.html

相关文章

  • Android Studio 视图对齐方式
    这里有两种类型的对齐1、layout_gravity用于当前视图相对于上级视图的对齐方式2、gravity用于下级视图相对于当前视图的对齐方式具体如下代码和图<?xmlversion="1.......
  • 线程的互斥和同步
    互斥:相互排斥,表示线程对共享资源的访问时相互排斥的,即不能同时操作(一个线程对共享资源写时,另外一个线程不能再对这个共享资源进行读写),保证线程的安全,互斥不能保证......
  • 父进程对子进程不进行回收,让系统去回收,线程也一样
    在父进程中,使用下面函数以后,父进程对子进程不进行回收,让操作系统去回收signal(SIGCHLD,SIG_IGN);如果主线程对子线程,不进行回收的时候,采用子线程和主线程分离,分离以......
  • 二维数组的声明及其作为函数参数的方式
    ◆概要本文以3行2列的二维数组为例,介绍了如何声明自动存储、静态存储和动态存储的二维数组,及其如何将它们作为函数参数进行传递的方式。◆实现处理自动存储或静态......
  • QT多线程实现冒泡排序和快速排序方法一
    qt4的线程方式#include"mythread.h"#include<QElapsedTimer>#include<QDebug>Generate::Generate(QObject*parent):QThread(parent){}voidGenerate::recvNum(intnum......
  • qt多线程实现快速排序和冒泡排序方法二
    qt5多线程处理方式#include"mainwindow.h"#include"ui_mainwindow.h"#include"mythread.h"#include<QThread>MainWindow::MainWindow(QWidget*parent):QMainWindo......
  • day04-原生的API&注解方式
    原生的API&注解方式1.MyBatis原生的API调用1.1原生API快速入门需求:在前面的项目基础上,使用MyBatis原生的API完成,即直接通过SqlSession接口的方法来完成操作1.2代码实......
  • Java学习之多线程
    线程的三种创建线程Threadclass:继承实现线程类(不建议使用)Runnable接口:实现接口(推荐使用,避免单继承局限性)Callable接口:实现接口(了解)ThreadClass实现方式......
  • 半同步/半反应堆线程池
    介绍异步线程只有一个,由主线程充当,它负责监听所有socket上的事件如果监听socket上发生读事件(有新的连接请求到来),主线程就接受得到新的连接socket,然后往epoll内核......
  • 计算机网络--3种交换方式
               ......