一、C语言锁机制介绍
1.接口介绍
| 接口 | 接口说明 |
|---|
| pthread_mutexattr_init | 初始化锁属性 |
| pthread_mutexattr_settype | 设置锁属性 |
| pthread_mutex_init | 初始化锁 |
| pthread_mutex_lock | 加锁 |
| pthread_mutex_unlock | 释放锁 |
2.锁属性介绍
| 属性 | 属性说明 |
|---|
| PTHREAD_MUTEX_NORMAL | 不自动检测死锁,尝试重复上锁等行为会出现死锁行为 |
| PTHREAD_MUTEX_ERRORCHECK | 会自动检测死锁,出现死锁行为会直接返回一个错误码 |
| PTHREAD_MUTEX_RECURSIVE | 可以重复上锁,但需要使用同样多的解锁操作才能解锁 |
| PTHREAD_MUTEX_DEFAULT | 锁属性默认值,不会自动检测死锁 |
3.发生死锁的行为
- 1.一个线程试图对互斥所重复上锁
- 2.一个线程对已经解锁的互斥锁进行解锁
- 3.试图解锁一个由别的线程锁定的互斥锁,引发不可预料行为
二、C语言锁机制使用
#include<stdio.h>
#include<pthread.h>
int global = 0;
pthread_mutex_t mutex;
void *work()
{
pthread_mutex_lock(&mutex);
int index = 0;
for (;index < 3; index++) {
global += 10;
pthread_t tid = pthread_self();
printf("threadId: %u global: %u\n", tid, global);
}
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_t threadId1;
pthread_t threadId2;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &attr);
pthread_create(&threadId1, NULL, (void *)work, NULL);
pthread_create(&threadId2, NULL, (void *)work, NULL);
pthread_join(threadId1, NULL);
pthread_join(threadId2, NULL);
return 0;
}
三、pthread_mutex_t结构体内容剖析
| 字段 | 字段说明 |
|---|
| count | 加锁次数(通常用于递归锁) |
| owner | 持有该锁的线程号 |
| kind | 锁的类型 |
