zoukankan      html  css  js  c++  java
  • 对于多线程编程的互斥锁和条件变量以及信号量的理解

    对于多线程编程,我们有时候会遇到多个线程需要互斥访问同一个资源的问题,或者是线程间同步的问题,比如生存者和消费者,下面我就来讲讲多线程编程中的同步和互斥的问题。

    1:互斥锁

    当有一个链表,这个链表需要两个线程互斥访问时,我们就需要互斥锁。为什么呢?因为当一个线程要去使用这个链表时,首先他得先获得锁,一旦发现锁已经被别的线程占用,则无法获得锁将阻塞等待互斥锁被别人解锁,当然也有办法不阻塞,一旦无法获得锁,则直接返回。

    如何初始化锁:

    函数原型:

    int pthread_mutex_init (pthread_mutex_t*mutex,constpthread_mutexattr_t* mutexattr);
    函数传入值:  mutex:互斥锁。

    互斥锁有三种类型:

    mutexattr:

    PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁。
    PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁。
    PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP  创建检错互斥锁。

    区别如下:

    互斥量分为下面三种:
    1、快速型。这种类型也是默认的类型。该线程的行为正如上面所说的。
    2、递归型。如果遇到我们上面所提到的死锁情况,同一线程循环给互斥量上锁,那么系统将会知道该上锁行为来自同一线程,那么就会同意线程给该互斥量上锁。
    3、错误检测型。如果该互斥量已经被上锁,那么后续的上锁将会失败而不会阻塞,pthread_mutex_lock()操作将会返回EDEADLK。

    使用方式如下:

    pthread_mutex_t mutex;
    pthread_mutex_init (&mutex, NULL); /*定义*/
    ...

    pthread_mutex_lock(&mutex); /*获取互斥锁*/
    临界资源
    pthread_mutex_unlock(&mutex); /*释放互斥锁*/

    此时对锁的访问时阻塞的。所以这就会出现这么一个问题,当同一个线程已经获得这个锁,并且没有释放这个锁,如果他在申请锁,将造成死锁。所以对于同一个线程获取了锁,记得要释放。不要因为其他原因导致释放锁没有被执行,而再次去请求锁。

    2:条件变量

  • 相关阅读:
    WIN10 UBUNTU 异常:sleep: cannot read realtime clock: Invalid argument
    Mysql表名大小写忽略
    Spring boot自定义配置文件并映射到指定类中
    list addAll产生异常java.lang.UnsupportedOperationException
    Oracle extract函数提取时分秒的问题
    JOOQ默认schema
    Druid数据库连接失败,无限尝试问题
    Mysql安装后root无法登陆(Access denied for user 'root'@'localhost')
    JavaSE第17篇:集合之Map集合
    JavaSE第16篇:集合之Collection集合下篇
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2870630.html
Copyright © 2011-2022 走看看