【C】锁机制用法总结

251 阅读1分钟

一、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;

// 1.定义锁
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;

    // 2.定义锁属性
    pthread_mutexattr_t attr;
    // 3.初始化锁属性
    pthread_mutexattr_init(&attr);
    // 4.设置锁属性
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    // 5.使用锁属性对锁进行初始化
    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锁的类型