多线程编程——互斥锁/条件变量

一,互斥锁

在多任务操作系统中,有很多任务同时执行,这些任务可能会用到同一个资源,如果没有一种机制来控制这些任务共享同一个资源,那这些任务可能无法正常使用自己想用的资源。互斥锁--是多任务操作系统中一种简单的加锁方法,来控制各任务对共享资源的访问。

互斥锁的状态:上锁(LOCK)和解锁(UNLOCK);

互斥锁的操作函数:

1 初始化一个互斥锁。
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

2 对互斥锁上锁,若互斥锁已经上锁,则调用者一直阻塞,直到互斥锁解锁后再上锁。
int pthread_mutex_lock(pthread_mutex_t *mutex);

3 调用该函数时,若互斥锁未加锁,则上锁,返回 0;若互斥锁已加锁,则函数直接返回失败,即 EBUSY。
int pthread_mutex_trylock(pthread_mutex_t *mutex);

4 对指定的互斥锁解锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex);

5 销毁指定的一个互斥锁。互斥锁在使用完毕后,必须要对互斥锁进行销毁,以释放资源。
int pthread_mutex_destroy(pthread_mutex_t *mutex);

互斥锁操作流程:

1. 在访问共享资源后临界区域前,对互斥锁进行加锁,若互斥锁已经上锁则线程阻塞,直到锁被释放;

2. 在访问完成后释放互斥锁导上的锁。
二,条件变量

条件变量--自动阻塞一个线程,直到某条件发生,一般和互斥锁同时使用。

操作函数:

1 初始化条件变量
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);

2 阻塞等待
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

3 超时等待
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

4 解除所有线程的阻塞
int pthread_cond_destroy(pthread_cond_t *cond);

5 至少唤醒一个等待该条件的线程
int pthread_cond_signal(pthread_cond_t *cond);

6 唤醒等待该条件的所有线程
int pthread_cond_broadcast(pthread_cond_t *cond);

三,互斥锁和条件变量共同使用

1 互斥锁为什么需要条件变量?

互斥锁的特点是资源的”无序访问“,想一下,如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥锁加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。 条件变量(cond)是在多线程程序中用来实现"等待--》唤醒"逻辑常用的方法。条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”。有了条件变量就可以避免多个阻塞的线程同时被唤醒,而是同步执行。

2 条件变量为什么需要互斥锁?

这就回到多任务共享资源的问题,为了防止由于线程并发执行所引起的资源竞争,所以要让每个线程互斥的访问公有资源,这就需要对共有资源进行加锁。

3 使用方法

pthread_mutex_lock(&mutex)

if()

pthread_cond_wait(&cond, &mutex);

pthread_mutex_unlock(&mutex);

之前的一个疑问:可以看到线程是先加锁然后判断条件,if语句如果不满足执行执行线程阻塞,那线程加的锁岂不是释放不了了,这个问题就是pthread_cond_wait的执行机制了,当pthread_cond_wait被调用线程阻塞的时候,pthread_cond_wait会自动释放互斥锁。释放互斥锁的时机:线程从调用pthread_cond_wait到操作系统把他放在线程等待队列之后。这也就解决了疑问。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值