《C++编程规范》学习笔记(3)

第12条 懂得何时和如何进行并发性编程

  •  如果应用程序使用了多线程或进程,要知道如何尽量减少共享对象,以及如何安全地共享必须共享的对象。
  • 参考目标平台的文档,了解该平台的同步化原语。
  • 最好将平台的原语用自己设计 的抽象包装起来,方便移植
  • 确保正在使用的类型在多线程程序中使用时安全的

 在自己编写可用于多线程程序的类型时,必须完成2个任务:必须确保不同线程能够不加锁地使用该类型的不同对象。其次,必须在文档中说明使用者在不同线程中使用该类型的同一个对象需要做什么,基本的设计问题是如何在类以及其客户之间分配正确执行的职责。主要的选择有

 外部加锁:调用者负责加锁。

内部加锁:每个对象将所有对自己的访问串行化,通常采用为每个共有成员函数加锁的方法来实现,这样调用者就可以不用串行化对象的使用了 。这个选项在以下2中情况下适用:该类型的对象几乎总是被跨线程共享,否则到头来只不过是进行了无效加锁。必须知道成员函数加锁的粒度是合适的,而且能满足大多数调用者的需要。

 不加锁的设计,包括不变形(只读对象):无需加锁。

 第13条  确保资源为对象所拥有。使用显式的RAII(resource acquisition is initialization)和智能指针

 每当处理需要配对的获取/释放函数调用的资源时,都应该将资源封装在一个对象中,让对象为我们强制配对,并在其析构函数中执行资源释放。

 实现RAII时,要小心复制和赋值构造函数(item 49),编译器生成的版本可能不正确。如果复制没有意义,通过将其设为私有并且不做定义来明确禁用二者(item 53)。

确保所有资源都为对象所有。最好使用智能指针而不是原始指针来保存动态分配的资源。

绝对不要再一个语句中分配一个以上的资源,应该在自己的代码语句中执行显示的资源分配,而且每次都应该马上将分配的资源赋予管理对象(item 31)

原文地址:https://www.cnblogs.com/kwliu/p/2195912.html