互斥锁和条件变量

互斥琐

定义:指代相互排斥,最基本的同步形式。用于保护临界区,以保证任何时刻只有一个线程或一个进程在执行其中的代码。

上锁:pthread_mutex_lock()

          临界区

解锁:pthread_mutex_unlock();


条件变量

定义:用于等待信号,同步的另一种手段。每一个条件变量总有一个互斥琐与之关联。

等待函数:pthread_cond_wait();

信号发送函数:pthread_cond_signal();


生产者和消费者的问题:生产者向buf添加数据,添加到 m 个,消费者读数据,读到 i 个;

1.如果只用互斥琐解决,消费者读的每一个i  数据,都必须先上锁 m ,然后查询 i < m ? 然后解锁,如果不小于,则接着上锁——查询——解锁,需要轮询,这将非常消耗CPU。

2.互斥琐+条件变量完美解决这个问题:互斥琐用于上锁,条件变量用于等待,生产者流程 上锁——生产数据——解锁,上锁——改变条件,发信号——解锁。(条件用来通知消费者数据准备好,为避免上锁冲突,需要先改变条件再发信号)。消费者流程 上锁——等待条件,改变条件——解锁。


附加:
读写锁

同步一些线程共享的一个或多个数据的访问或更新。

属性:只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。

           仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于写。

相关函数:pthread_rwlock_rdlock();//获取一个读出锁;

                  pthread_rwlock_wrlock();//获取一个写入锁;

                  pthread_rwlock_unlock();//释放一个读出锁或写入锁;

记录上锁:读写锁的一种扩展类型,可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读和写。被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl.这种锁通常在内核中维护,属主是由属主的进程ID标识的。


               


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值