2.1mutex-2.1.1只用非递归的mutex
主要是作者的编程经验之谈,用非递归的好排错,防止出现奇奇怪怪的不知道什么情况的问题
比如说书上说的迭代器失效的问题
就是当doit里面调用了post的时候的情况,如果是递归的mutex,那么foos就会push东西进去,导致traverse里面的迭代器出问题,事实上应该让doit走完再push,如果是非递归的情况那么在走到post的时候就会报错
2.1.2死锁
书上讲的例子挺难顶的代码就不放了说一下为什么死锁,主要其实是,他在子线程里面调用了threadFunc然后让他最后一步del不执行,当进到print的临界区的时候再执行del,这个时候的mutex其实是被析构掉了,然后就死锁了,挺傻逼的,有点过于刻意的感觉
2.2条件变量
这个我后面写boost多线程连接池的时候再讲
2.3不要用读写锁
还是前面说的不好排错建议用简单的锁,后面也写了多线程读写应该怎么写好
2.4-2.7
线程安全单例写过,这个封装看起来没必要,我用之前写的那种,sleep()用来同步看起来就傻逼
2.8shared_ptr实现copy-on-write
挺简单的其实
对于read端:
可以同时有多个人读所以你会看到for循环的位置是没有加锁的,每次读加锁拷贝构造shared_ptr+1就完了,此时会多一个foos管理内容,
对于write端:
首先写法保证只用一个写,所以要全程上锁,不允许在有人写的时候或者有人在拷贝g_foos的时候修改,但是有人在读的时候是可以修改的,只不过读的那个人读的是还没修改之前的数据
当shared_ptr>1时说明有人读,那么就重新生成一个,把原来的g_foos shared_ptr管理的给替换掉,但是是不影响foos,然后修改新的g_foos里面的内容就完了
后面的例子没啥好说的原理一样
评论已关闭