首页 > 其他分享 >14.5 互斥锁

14.5 互斥锁

时间:2023-03-02 20:11:06浏览次数:52  
标签:14.5 加锁 解锁 互斥 mutex pthread 线程

互斥锁

类似于PV操作。用于同步线程对共享数据的访问

类型为:pthread_mutex_t

14.5.1 基础API

#include<pthread.h>
//用于初始化互斥锁。若mutexattr为NULL,则表示使用默认属性。
int pthread_mutex_init(pthread_mutex_t* mutex,const pthread_mutexattr_t* mutexattr);
//用于销毁互斥锁,以释放其占用的内核资源。销毁一个已经加锁的互斥锁将导致不可预期的后果。
int pthread_mutex_destroy(pthread_mutex_t* mutex);
//原子操作的方式给一个互斥锁加锁。如果目标互斥锁已经被锁上,则pthread_mutex_lock调用将阻塞
int pthread_mutex_lock(pthread_mutex_t* mutex);
//非阻塞上锁,返回错误码EBUSY
int pthread_mutex_trylock(pthread_mutex_t* mutex);
//以原子操作的方式给一个互斥锁解锁。
int pthread_mutex_unlock(pthread_mutex_t* mutex);

注意:pthread_mutex_lock 和 pthread_mutex_trylock是针对普通锁而言的。

14.5.2 互斥锁属性

类型:pthread_mutexattr_t

#include<pthread.h>
/*初始化互斥锁属性对象*/
int pthread_mutexattr_init(pthread_mutexattr_t* attr);
/*销毁互斥锁属性对象*/
int pthread_mutexattr_destroy(pthread_mutexattr_t* attr);
/*获取和设置互斥锁的pshared属性*/
int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr,int* pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t* attr,int pshared);
/*获取和设置互斥锁的type属性*/
int pthread_mutexattr_gettype(const pthread_mutexattr_t* attr,int* type);
int pthread_mutexattr_settype(pthread_mutexattr_t* attr,int type);
  • pshared:指定是否允许跨进程共享互斥锁

    • PTHREAD_PROCESS_SHARED:互斥锁可以被跨进程共享
    • PTHREAD_PROCESS_PRIVATE:互斥锁只能被和锁的初始化线程隶属于同一个进程的线程共享。
  • type互斥锁的类型以及死锁示例

    • PTHREAD_MUTEX_NORMAL:普通锁,默认类型。

      当一个线程对一个普通锁加锁以后,其余请求该锁的线程将形成一个等待队列,并在该锁解锁后按优先级获得它。这种锁类型保证了资源分配的公平性。
      但这种锁也很容易引发问题:一个线程(A)如果对一个已经加锁(也是由线程A加锁)的普通锁再次加锁,将引发死锁(EG:设计有BUG的递归程序);对一个已经被其他线程加锁的普通锁解锁,或者对一个已经解锁的普通锁再次解锁,将导致不可预期的后果。【注意:这里指的是是同一个线程对mutex多次加锁、解锁;而不是不同线程对一个mutex加锁解锁】

    • PTHREAD_MUTEX_ERRORCHECK:检错锁。

      一个线程如果对一个已经加锁的检错锁再次加锁,则加锁操作返回EDEADLK。对一个已经被其他线程加锁的检错锁解锁,或者对一个已经解锁的检错锁再次解锁,则解锁操作返回EPERM。

    • PTHREAD_MUTEX_RECURSIVE:嵌套锁。

      这种锁允许一个线程在释放锁之前多次对它加锁而不发生死锁。不过其他线程如果要
      获得这个锁,则当前锁的拥有者必须执行相应次数的解锁操作。对一个已经被其他线程加锁的嵌套锁解锁,或者对一个已经解锁的嵌套锁再次解锁,则解锁操作返回EPERM。

    • PTHREAD_MUTEX_DEFAULT:默认锁。

      一个线程如果对一个已经加锁的默认锁再次加锁,或者对一个已经被其他线程加锁的默认锁解锁,或者对一个已经解锁的默认锁再次解锁,将导致不可预期的后果。

标签:14.5,加锁,解锁,互斥,mutex,pthread,线程
From: https://www.cnblogs.com/xvxing/p/17173264.html

相关文章

  • C++11/std::atomic - 原子变量(不加锁实现线程互斥)
     文章目录1原子操作2C++11原子变量3使用原子变量3.1没有使用线程互斥的数据操作3.2使用互斥量保证线程互斥3.3使用原子量std::atomic保证数据互斥......
  • 自旋锁、信号量、互斥体概述
    在Linux系统中有大量的临界资源需要保护,如何让各个任务有条不紊的访问这些资源,这涉及到Linux中并发访问的保护机制设计相关知识。后面会详细介绍这几个机制。(据可靠消息,锁......
  • 线程互斥实现方式
    1.互斥锁2.读写硕3.线程信号量 互斥锁:互斥锁的数据类型:pthread_mutex_t互斥锁是一种加锁的方法来控制对共享资源的访问。同一时刻只能由一个线程掌握某......
  • 线程的互斥和同步
    互斥:相互排斥,表示线程对共享资源的访问时相互排斥的,即不能同时操作(一个线程对共享资源写时,另外一个线程不能再对这个共享资源进行读写),保证线程的安全,互斥不能保证......
  • 互斥锁
    介绍初始化锁#include<pthread.h>intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexattr_t*restrictattr);......
  • 字符设备驱动程序之同步互斥阻塞
    1.原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。常用原子操作函数举例:atomic_tv=ATOMIC_INIT(0);//定义原子变量v并初始化为0atomic_read(ato......
  • 同步与互斥
    同步与互斥什么是同步与互斥一、互斥互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的二......
  • 进程互斥的软件实现方法
    进程互斥的软件实现方法1、单标志法单标志法违背空闲让进原则。2、双标志先检查双标志先检查法违反忙则等待原则。3、双标志后检查双标志后检查法违背了空闲......
  • Linux基础实训(利用线程和互斥锁)
                         实验要求(linux)1定义一个长度为8的数组2输入不同的8个(大写)字母(ASDFGHJK)3对字符串进行排序4用线程和互斥锁输出按顺......
  • 期末复习——同步、互斥、死锁
    不同进程之间的关系同步=直接制约关系,相互之间协调顺序,进行阻塞等调整。互斥=间接制约关系,一个进程进入临界区,另一进程必须等待。同步临界区问题多道程序环......