← 返回首页
Linux高级程序设计(七十七)
发表时间:2021-12-25 12:52:27
互斥锁的概念

1.互斥锁的概念

linux里的线程可以通过互斥锁(mutex)实现互斥,互斥锁是一种简单的加锁的方法来控制对临界资源的互斥访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。

一个线程在访问临界资源前首先申请mutex,如果metex处于unlock状态,则申请成功,并立刻上锁(lock)。如果metex处于lock状态,则该线程阻塞。

2.初始化互斥锁

互斥锁的操作流程如下: 1. 在访问共享资源后临界区域前,对互斥锁进行加锁。 2. 在访问完成后释放互斥锁导上的锁。 3. 对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放。

互斥锁的数据类型是: pthread_mutex_t。

使用pthread_mutex_init函数来初始化互斥锁。

#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

参数: - mutex:互斥锁地址。类型是 pthread_mutex_t 。 - attr:设置互斥量的属性,通常可采用默认属性,即可将 attr 设为 NULL。

可以使用宏 PTHREAD_MUTEX_INITIALIZER 静态初始化互斥锁,比如: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 这种方法等价于使用 NULL 指定的 attr 参数调用 pthread_mutex_init () 来完成动态初始化,不同之处在于 PTHREAD_MUTEX_INITIALIZER 宏不进行错误检查。

返回值: - 成功:0,成功申请的锁默认是打开的。 - 失败:非 0 错误码

实例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>  
#include <unistd.h>  

int main(int argc, char const *argv[])
{
    pthread_mutex_t mutex; //互斥锁

    if(pthread_mutex_init(&mutex, NULL)!=0) //初始化互斥锁
    {
       perror("mutex init error:");
       exit(-1);
    }

    //方式二:可以使用宏 PTHREAD_MUTEX_INITIALIZER 静态初始化互斥锁
    //pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

    printf("init mutex success.\n");
    return 0;
}

执行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
init mutex success.