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:条件变量

  • 相关阅读:
    【原创】Apache ab结果参数详解
    【转载】QPS,用户平均等待时间,服务器平均请求处理时间
    【原创】Apache ab测试时出现:apr_socket_recv "connection reset by peer" 104
    【做题】Codeforces Round #429 (Div. 2) E. On the Bench——组合问题+dp
    oracle递归查询
    http1.0和1.1的区别
    here with you
    spring杂碎
    西海情歌
    //随机生成 10到20条数据 数据包含 用户名(5-10位的字母) 性别 年龄(1-100岁)
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2870630.html
Copyright © 2011-2022 走看看