互斥锁和条件变量总结&接口介绍【pthread_mutex_init/lock/trylock/unlock/destroy】【pthread_cond_init/wait/timedwait/..】

0 - 前言

本文主要总结互斥锁和条件变量的关键接口

参考:

C语言技术网-线程同步

条件变量

1 - 互斥锁

互斥锁时对于互斥资源(也叫临界资源)来说的,比如说有一个公共账户,有很多人都想对这个账户进行操作(存钱、取钱),为了保护账户操作的稳定,使用一种保障机制来保证同一时刻只有一个人操作账户。这种保障机制就是互斥锁。

每个临界资源对应一个互斥锁,多个线程都想获取临界资源的使用权时,必须先获得互斥锁,锁定临界资源后,才能对临界资源进行操作。

互斥锁的类型为:pthread_mutex_t

1-1 初始化锁

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

1-2 加锁

加锁分为阻塞加锁非阻塞加锁两种

阻塞加锁

int pthread_mutex_lock(pthread_mutex *mutex);

如果是锁是空闲状态,本线程将获得这个锁;如果锁已经被占据,本线程将排队等待,直到成功的获取锁。

非阻塞加锁

int pthread_mutex_trylock( pthread_mutex_t *mutex);

该函数语义与 pthread_mutex_lock() 类似,不同的是在锁已经被占据时立即返回 EBUSY(一种错误类型),而不是挂起等待。

1-3 解锁

int pthread_mutex_unlock(pthread_mutex *mutex);

1-4 销毁锁

int pthread_mutex_destroy(pthread_mutex *mutex);

销毁锁之前,锁必需是空闲状态(unlock),否则返回EBUSY

2 - 条件变量

条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用

条件变量的类型为:pthread_cond_t

2-1 初始化条件变量

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)

2-2 等待条件变量

分为阻塞等待与**非阻塞等待(也叫限时等待)**两种

阻塞等待

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)

pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用 pthread_cond_signal() 或 pthread_cond_broadcast来唤醒它 。

pthread_cond_wait() 必须与pthread_mutex 配套使用。 pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。

也就是说,pthread_cond_wait函数成功返回时,内部完成了三件事

1、释放互斥锁:刚调用该函数,使线程进入等待

2、等待条件变量:线程开始等待。当另一个线程改变条件变量,满足触发条件时,正在等待的这个线程进入第3步

3、条件触发,互斥锁加锁:本线程对临界资源加锁,开始自己的操作(等了这么久,终于轮到我对临界资源操作了)

限时等待

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)

2-3 唤醒线程

唤醒阻塞在条件变量上的线程

int pthread_cond_broadcast(pthread_cond_t *cond);

pthread_cond_signal 函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行。如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回

int pthread_cond_signal(pthread_cond_t *cond); 

pthread_cond_broadcast() 唤醒全部阻塞在条件变量上的线程

2-4 销毁条件变量

int pthread_cond_destroy(pthread_cond_t *cond);

只有在没有线程在该条件变量上等待时,才可以注销条件变量,否则会返回EBUSY

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/117001801