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.