互斥锁的使用

互斥锁API

在Linux中,你可以使用互斥锁(Mutex)来实现多线程或多进程之间的互斥访问。互斥锁用于确保在同一时间只有一个线程或进程可以访问共享资源,以避免竞争条件和数据损坏。
Linux中提供了一些用于操作互斥锁的API,主要是通过pthread_mutex_*系列函数来实现。下面是一些常用的互斥锁API的介绍:

  1. pthread_mutex_init: 该函数用于初始化一个互斥锁。mutex是要初始化的互斥锁的指针,attr是一个可选的互斥锁属性对象的指针,通常传入NULL以使用默认属性。成功时返回0,失败时返回一个非零的错误码。

  2. pthread_mutex_destroy: 该函数用于销毁一个互斥锁,并释放相关资源。mutex是要销毁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。

  3. pthread_mutex_lock: 该函数用于获得一个互斥锁的所有权。如果互斥锁已被其他线程锁住,则调用线程将被阻塞,直到互斥锁变为可用。mutex是要加锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。

  4. pthread_mutex_trylock: 该函数与pthread_mutex_lock类似,但是它尝试获得互斥锁的所有权,如果互斥锁已被其他线程锁住,则立即返回并返回一个非零值。mutex是要尝试加锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。

  5. pthread_mutex_unlock: 该函数用于释放一个互斥锁的所有权,允许其他线程获得该互斥锁。mutex是要解锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。

  6. pthread_mutexattr_init: 该函数用于初始化一个互斥锁属性对象。attr是要初始化的互斥锁属性对象的指针。成功时返回0,失败时返回一个非零的错误码。

  7. pthread_mutexattr_destroy: 该函数用于销毁一个互斥锁属性对象,并释放相关资源。attr是要销毁的互斥锁属性对象的指针。成功时返回0,失败时返回一个非零的错误码。

互斥锁会导致休眠, 所以在中断里面不能用互斥锁。 同一时刻只能有一个线程持有互斥锁,并且只有持有者才可以解锁, 并且不允许递归上锁和解锁。

使用互斥锁的步骤

  1. 初始化互斥锁: 通常在使用互斥锁之前,需要对其进行初始化。可以使用pthread_mutex_init函数来初始化互斥锁。例如:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  1. 加锁(Lock): 在访问共享资源之前,线程需要先获得互斥锁的所有权。这可以通过调用pthread_mutex_lock函数来实现。如果互斥锁已被其他线程锁住,则当前线程会被阻塞,直到互斥锁可用。

pthread_mutex_lock(&mutex);
  1. 访问共享资源: 一旦获得了互斥锁的所有权,线程可以安全地访问共享资源。

  2. 解锁(Unlock): 当线程完成对共享资源的访问时,需要释放互斥锁,以便其他线程可以获得对共享资源的访问权限。这可以通过调用pthread_mutex_unlock函数来实现。

pthread_mutex_unlock(&mutex);
  1. 销毁互斥锁: 在不再需要使用互斥锁时,需要将其销毁以释放资源。可以使用pthread_mutex_destroy函数来销毁互斥锁。

pthread_mutex_destroy(&mutex);

互斥锁使用规则

  1. 只有mutex的owner可以才可以释放锁

  2. 不可以多次释放同一把锁

  3. 不允许重复获取同一把锁,否则会死锁

  4. 必须使用mutex初始化API来完成锁的初始化,不能使用类似memset或者memcp之类的函数进行mutex初始化

  5. 不可以多次重复对mutex锁进行初始化

  6. 线程退出后必须释放自己持有的所有mutex锁

作者:SteveChen  创建时间:2025-03-30 20:50
最后编辑:SteveChen  更新时间:2025-03-30 20:51
上一篇:
下一篇: