为何线程互斥锁优于读写锁

尽管确实是在读多写少的情况下使用,但系统在测试中确实出现线程互斥锁优于读写锁的情况,

muduo库中给出了多种互斥锁优于读写锁的原因:

1. 读锁加锁的开销不会比mutex小,因为它需要更新当前reader的数目,如果临界区很小,那么mutex往往更快。

实际上mutex是由整形变量及等待队列构成

2. 读锁可能提升为写锁,增大调试难度

实际上系统调试过程中的确出现过这样的问题,甚至导致死锁,当时是以这样顺序调用的:

写申请(获得写锁)->读申请(读申请被忽略)->释放(实际把写锁释放)->释放(实际获得读锁)->下次的写申请(卡死)

3. 写锁会阻塞后面的读锁,在要求读低延迟的情况下使用并不适当。

这条完全不明白。

至于spinlock与互斥锁的使用对比在这篇文章《Pthreads mutex vs Pthreads spinlock》介绍得十分清楚。

 

面试题:猜奖品问题

一个猜测游戏中,某一个瓶子中装有奖品。游戏者需要猜出奖品在哪个瓶子中,并且在m次结束游戏。(即m次猜中)
有n个黑色的瓶子(以至于游戏中看不到瓶中是否有东西)设从0到n-1编号,一字排开。每一次如果游戏者猜错了,那么奖品会各以50%的概率移动到左边或者右边的瓶子中。当奖品位于最左边或者最右边,游戏者猜错时,奖品必然右移或者左移。

问题:请设计一个满足n和m的策略,帮助游戏者完成游戏。

最多需要m=2n次 必能猜中
第一轮 先从0开始顺序往右猜,即0,1,…n-1,这样 如果奖品初始位于偶数位置处 必定能猜中
如果奖品初始是位于奇数处,则需要第二轮
如果n为偶数 则第一轮结束后奖品仍在奇数处
这样第二轮从1开始往右,即1,2,…,n-1 这样必中
如果n为奇数 则第一轮结束后奖品已经跳到偶数处
这样第二轮从0开始往右,即0,1,…,n-1 必中

C++中的局部类与嵌套类

局部类指在函数内部定义的类,自然局部类不能含有static成员,所有函数定义也必须在定义体内完成。基本不会使用。

嵌套类指在类内部定义类,该类名只能在外围类中使用,嵌套类中的函数成员可以在定义体外定义(但是需要使用限定符以使用类名),嵌套类中申明的成员不是外围类对象的成员,反之亦然。

因此分析访问关系时,完全可以当做非嵌套类处理,即嵌套类无法访问外围类的私有成员,也不能对外围类中定义的私有嵌套类创建对象,嵌套类可以访问static private成员,嵌套类中申明的友元也不能访问外围类中的私有成员。

本站总访问量