• 对于多线程编程的互斥锁和条件变量以及信号量的理解


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

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

  • 相关阅读:
    通过代码获取log4net的文件路径
    关键字后面不加空格
    ASP.NET MVC 4 Content Map
    ASP.NET Overview
    ASP.NET 4 and Visual Studio 2010
    Newtonsoft.Json
    ASP.NET MVC
    log4net
    AutoMapper introduction
    ajax jsonp跨域
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2870630.html
Copyright © 2020-2023  润新知