互斥锁

Posted on 2023-02-23 15:31  lyc2002  阅读(19)  评论(0编辑  收藏  举报

介绍

初始化锁

#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_unlock(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;
 }

注意事项

  • 不是所有线程都可以对互斥锁解锁,哪个线程加的锁,哪个线程才能解锁成功

死锁

  • 加锁后忘记解锁
  • 重复加锁
  • 多个共享资源,互相请求