互斥锁的使用
互斥锁的使用
互斥锁API
在Linux中,你可以使用互斥锁(Mutex)来实现多线程或多进程之间的互斥访问。互斥锁用于确保在同一时间只有一个线程或进程可以访问共享资源,以避免竞争条件和数据损坏。
Linux中提供了一些用于操作互斥锁的API,主要是通过pthread_mutex_*系列函数来实现。下面是一些常用的互斥锁API的介绍:
pthread_mutex_init: 该函数用于初始化一个互斥锁。mutex是要初始化的互斥锁的指针,attr是一个可选的互斥锁属性对象的指针,通常传入NULL以使用默认属性。成功时返回0,失败时返回一个非零的错误码。
pthread_mutex_destroy: 该函数用于销毁一个互斥锁,并释放相关资源。mutex是要销毁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。
pthread_mutex_lock: 该函数用于获得一个互斥锁的所有权。如果互斥锁已被其他线程锁住,则调用线程将被阻塞,直到互斥锁变为可用。mutex是要加锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。
pthread_mutex_trylock: 该函数与pthread_mutex_lock类似,但是它尝试获得互斥锁的所有权,如果互斥锁已被其他线程锁住,则立即返回并返回一个非零值。mutex是要尝试加锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。
pthread_mutex_unlock: 该函数用于释放一个互斥锁的所有权,允许其他线程获得该互斥锁。mutex是要解锁的互斥锁的指针。成功时返回0,失败时返回一个非零的错误码。
pthread_mutexattr_init: 该函数用于初始化一个互斥锁属性对象。attr是要初始化的互斥锁属性对象的指针。成功时返回0,失败时返回一个非零的错误码。
pthread_mutexattr_destroy: 该函数用于销毁一个互斥锁属性对象,并释放相关资源。attr是要销毁的互斥锁属性对象的指针。成功时返回0,失败时返回一个非零的错误码。
互斥锁会导致休眠, 所以在中断里面不能用互斥锁。 同一时刻只能有一个线程持有互斥锁,并且只有持有者才可以解锁, 并且不允许递归上锁和解锁。
使用互斥锁的步骤
初始化互斥锁: 通常在使用互斥锁之前,需要对其进行初始化。可以使用pthread_mutex_init函数来初始化互斥锁。例如:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
加锁(Lock): 在访问共享资源之前,线程需要先获得互斥锁的所有权。这可以通过调用pthread_mutex_lock函数来实现。如果互斥锁已被其他线程锁住,则当前线程会被阻塞,直到互斥锁可用。
pthread_mutex_lock(&mutex);
访问共享资源: 一旦获得了互斥锁的所有权,线程可以安全地访问共享资源。
解锁(Unlock): 当线程完成对共享资源的访问时,需要释放互斥锁,以便其他线程可以获得对共享资源的访问权限。这可以通过调用pthread_mutex_unlock函数来实现。
pthread_mutex_unlock(&mutex);
销毁互斥锁: 在不再需要使用互斥锁时,需要将其销毁以释放资源。可以使用pthread_mutex_destroy函数来销毁互斥锁。
pthread_mutex_destroy(&mutex);
互斥锁使用规则
只有mutex的owner可以才可以释放锁
不可以多次释放同一把锁
不允许重复获取同一把锁,否则会死锁
必须使用mutex初始化API来完成锁的初始化,不能使用类似memset或者memcp之类的函数进行mutex初始化
不可以多次重复对mutex锁进行初始化
线程退出后必须释放自己持有的所有mutex锁
最后编辑:SteveChen 更新时间:2025-03-30 20:51