互斥锁和条件变量的作用

@互斥锁和条件变量

互斥锁

互斥锁的作用

互斥锁用来保护代码临界区,从而保证任何时刻只有一个线程在临界区内执行。(防止多个线程或多个进程对内容进行同时读写)
互斥锁和条件变量被用来同步一个进程内的各个线程,如果一个互斥锁或条件变量存放在多个进程间共享的某个内存区中,则被用于进程间同步。

互斥锁的初始化

有两种初始化方式:
1、静态分配互斥锁:我们可以把它初始化为常量值

static pthread_mutex_t  lock = PTHREAD_MUTEX_INITIALIZER

2、动态分配互斥锁
使用malloc或分配到共享内存中,我们在允许前通过调用pthread_mutex_init函数来初始化。

#include <pthread.h>
 int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutexattr_t *attr);
 int pthread_mutex_destroy(pthread_mutex_t *mptr);

互斥锁的上锁与解锁

#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mptr);
int pthread_mutex_trylock(pthread_mutex_t *mptr);
int pthread_mutex_unlock(pthread_mutex_t *mptr);

如果已有另外的线程锁住了互斥锁,这时候再使用pthread_mutex_lock将阻塞到该互斥锁解锁为止,而pthread_mutex_unlock则不会阻塞,会立即返回一个EBUSY错误。
互斥锁用于保证任何时刻只有一个线程在执行其中的代码,或者任何时刻只有一个进程正在执行其中的代码。代码如下:
lock_the_mutex(…);
临界区
unlock_the_mutex(…);

条件变量

条件变量的作用

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

条件变量初始化

有两种初始化方式:
1、静态分配条件变量:我们可以把它初始化为常量值

static pthread_mutex_t  lock = PTHREAD_COND_INITIALIZER

2、动态分配互斥锁
使用malloc或分配到共享内存中,我们在允许前通过调用pthread_cond_init函数来初始化。

#include <pthread.h>
 int pthread_cond_init(pthread_mutex_t *cptr,const pthread_condattr_t *attr);

通过以下函数进行释放:
int pthread_cond_destory(const pthread_condattr_t *attr);

条件变量的使用

#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t * mptr);
int pthread_cond_signal(pthread_cond_t *cptr);

总结

1、互斥锁可以单独使用,用于解决资源的冲突访问。
2、条件变量通常配合互斥锁一起使用,条件变量的引入提高了代码的执行效率,为什么呢?如果没有条件变量,当生产者没有准备好的时候,消费者只能一次次的轮询,这是一种对CPU时间的浪费。而使用条件变量,消费者在条件不满足是进入睡眠,生产者改变条件变量触发信号通知消费者,消费者被唤醒工作,这是一种高效的通知机制。


内容来自《UNIX Network Programming》第七章

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值