互斥锁:

假设我们要在多线程中实现背景图片的控制:

class PrettyMenu{
public:
……
void changeBackground(std::istream& imgSrc);//改变背景图片
……
private:
Mutex mutex; //互斥量
Image* bgImage; //当前背景图片
int imageChanges; //背景图片改变次数
}; void PrettyMenu::changeBackground(std::istream& imgSrc)
{
lock(&mutex);
delete bgImage;
++imageChanges;
bgImage=new Image(imgSrc);
unlock(&mutex);
}

但是上面这些会遇到两个问题:

  • 如果 new Image(imgSrc)发生了异常,那么unlock就不会被执行,会被一直锁住
  • 发生上面异常,imageChanges也被累加,但实际上新的图片没有被安装

对于第一个问题:

被及时释放的互斥锁:

share_ptr我们可以指定它的删除器,所以可以在删除器中释放互斥锁.

如此即使是发生了异常,互斥锁也能够被及时的释放。

class Lock{
public:
explicit Lock(Mutex* mu):mutexPtr(mu,unlock)//以某个Mutex初始化,unlock作为删除其
{
lock(mutexPtr);
}
private:
shared_prt<Mutex> mutexPtr;
};

如果通过一个Lock类,然后在析构函数阶段进行 unlock也可以避免这个问题。但是这样的类进行复制的时候

可能存在很多不合理的问题。

如果希望保存资源直到最后一个对象消失,并且在复制的时候是引用计数,可以使用上面这种情况。


对于第二个问题:

swap的 全or无:

struct PMImpl{
std::tr1::shared_ptr<Image> bgImage;
int imageChanges;
};
class PrettyMenu{
……
private:
Mutex mutex;
std::tr1::shared_ptr<PMImpl> pImpl;
}; void PrettyMenu::changeBackground(std::istream& imgSrc)
{
using std::swap;//**条款**25
Lock m1(&mutex);
std::tr1::shared_ptr<PMImpl> pNew(new PMImpl(*pImpl));
pNew->bgImage.reset(new Image(imgSrc));;//修改副本
++pNew->imageChanges;
swap(pImpl,pNew);
}

我们可以先弄一个副本,在进行完所有的操作之后,再与目标对象进行交换。

从而实现: 要不然就不处理,不然就全部处理完。

所以我们需要一个 不会抛出异常的swap操作。


参考:

《Effective C++》

最新文章

  1. 开发基于Edge渲染内核的浏览器应用
  2. python使用xlrd模块读写excel
  3. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?
  4. js023-离线应用与客户端存储
  5. 前端开发利器-Brackets IDE
  6. loaded the &quot;XXXView&quot; nib but the view outlet was not set 解决方案
  7. 【转】android开源项目和框架
  8. NopCommerce架构分析之八------多语言
  9. oracle 问题若干 提醒注意
  10. js基础知识之_对象
  11. bzoj3997[TJOI2015]组合数学
  12. Effective Java2读书笔记-类和接口(二)
  13. gitbook初体验
  14. 解决MySQL中文乱码问题
  15. 《高性能MySQL》读书笔记(上)
  16. boot跳转到app后,中断不起作用的原因
  17. js regex variable &amp; Set, Map
  18. jrockit静默安装笔记
  19. redis,memcache二者的区别是?(优缺点)
  20. Asp.Net中使用Couchbase——Memcached缓存入门篇

热门文章

  1. 项目Beta预备
  2. django搭建web (五) views.py
  3. django模型——数据库(二)
  4. 自己写编程语言-m语言
  5. css3动画 一行字鼠标触发 hover 从左到右颜色渐变
  6. Python之旅.第四章.模块与包 4.02
  7. Nokia大事录
  8. 如何用UPA优化性能?先读懂这份报告!
  9. Python-基础学习-Day1
  10. emqtt 试用(四)emq 的主题访问控制 acl.conf