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

  • 相关阅读:
    51nod乘积之和
    Dell服务器安装OpenManage(OMSA)
    Nginx反向代理PHP
    搭建haproxy
    108. Convert Sorted Array to Binary Search Tree
    60. Permutation Sequence
    142. Linked List Cycle II
    129. Sum Root to Leaf Numbers
    118. Pascal's Triangle
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2870630.html
Copyright © 2011-2022 走看看