介绍
初始化锁
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能:初始化互斥锁
参数:
- mutex:互斥锁变量地址
- attr:互斥锁的属性,一般使用默认属性,传入 NULL
返回值:
- 成功返回 0
- 失败返回错误号
销毁锁
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:释放互斥锁资源
参数:
- mutex:互斥锁变量地址
返回值:
- 成功返回 0
- 失败返回错误号
加锁
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:将互斥锁锁定
- 如果没有被锁定,这个线程可以加锁成功,这个锁中会记录哪个线程加锁成功
- 如果已经被锁定了,这个线程会阻塞
参数:
- mutex:互斥锁变量地址
返回值:
- 成功返回 0
- 失败返回错误号
尝试加锁
#include <pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:尝试锁定互斥锁
- 如果这把锁是打开的,线程加锁成功
- 如果已经被锁,直接返回错误号,不会阻塞
参数:
- mutex:互斥锁变量地址
返回值:
- 成功返回 0
- 失败返回错误号
解锁
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:解开互斥锁
参数:
- mutex:互斥锁变量地址
返回值:
- 成功返回 0
- 失败返回错误号
简单使用
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define N 50
int num;
pthread_mutex_t mutex;
void * f1(void *arg)
{
for (int i = 0; i < N; i++) {
pthread_mutex_lock(&mutex);
int cur = num;
cur++;
usleep(1000);
num = cur;
printf("t1 num = %d\n", num);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void * f2(void *arg)
{
for (int i = 0; i < N; i++) {
pthread_mutex_lock(&mutex);
int cur = num;
cur++;
usleep(1000);
num = cur;
printf("t2 num = %d\n", num);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main()
{
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, NULL, f1, NULL);
pthread_create(&t2, NULL, f2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
注意事项
- 不是所有线程都可以对互斥锁解锁,哪个线程加的锁,哪个线程才能解锁成功
死锁
- 加锁后忘记解锁
- 重复加锁
- 多个共享资源,互相请求