首页 > 其他分享 >互斥锁

互斥锁

时间:2023-02-23 15:46:54浏览次数:30  
标签:int 互斥 num mutex pthread NULL

介绍

初始化锁

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

注意事项

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

死锁

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

标签:int,互斥,num,mutex,pthread,NULL
From: https://www.cnblogs.com/cong0221/p/17148177.html

相关文章

  • 字符设备驱动程序之同步互斥阻塞
    1.原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。常用原子操作函数举例:atomic_tv=ATOMIC_INIT(0);//定义原子变量v并初始化为0atomic_read(ato......
  • 同步与互斥
    同步与互斥什么是同步与互斥一、互斥互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的二......
  • 进程互斥的软件实现方法
    进程互斥的软件实现方法1、单标志法单标志法违背空闲让进原则。2、双标志先检查双标志先检查法违反忙则等待原则。3、双标志后检查双标志后检查法违背了空闲......
  • Linux基础实训(利用线程和互斥锁)
                         实验要求(linux)1定义一个长度为8的数组2输入不同的8个(大写)字母(ASDFGHJK)3对字符串进行排序4用线程和互斥锁输出按顺......
  • 期末复习——同步、互斥、死锁
    不同进程之间的关系同步=直接制约关系,相互之间协调顺序,进行阻塞等调整。互斥=间接制约关系,一个进程进入临界区,另一进程必须等待。同步临界区问题多道程序环......
  • <select>中<option>的互斥
    背景:我需要将单选和多选功能组合到一个控件中。具体来说,我有很多选项<option>。第一个选项是相互排斥的。因此,如果我选择第一个独占选项,则需要取消选中所有其他选项。如果......
  • 进程同步和进程互斥
    进程同步和进程互斥1、什么是进程同步2、什么是进程互斥知识回顾......
  • 【转】go Mutex (互斥锁)和RWMutex(读写锁)
    golang中sync包实现了两种锁Mutex(互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能.typeMutexfunc(m*Mutex)Lock(......
  • 互斥锁和读写锁
    锁用来控制多线程访问共享资源的工具。互斥锁:线程之间互斥,一个线程获取到锁,另一个线程要获取锁时,发现锁已经被其他线程获取,则不可获取锁。读写锁:将读写操作进行拆分,针对......
  • 信号量和互斥量
    Semaphore信号量信号量的取得和释放由不同线程进行可以是0/1,也可以是整型实现有序访问资源,有排队队列Mutex互斥量加锁和解锁必须是同一线程0/1不限制多线程的访问......