线程安全 就是多个线程访问同一个对象时
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。
1.1.3节中所谓一个线程安全的counter示例,每个counter对象有自己的mutex,因此不同的对象不构成锁争用lock contention
同时执行也没关系,只要他们不是访问同一个counter对象 ,也就是说不同对象他们是有各自的lock的, 但是另一种condition下,如果counter是动态创建的并通过指针来访问,前面的对象销毁时的race condition就还存在 ,因为指针访问的话就是同一个lock
1.2 对象的创建很简单
对象构造要做到线程安全 唯一的要求就是在构造期间不要泄露this指针
• 不要在构造函数中注册任何回调;
• 也不要在构造函数中把this 传给跨线程的对象;
• 即便在构造函数的最后一行也不行。
就是说在构造函数里的话它对象还没有完成初始化 如果他this被泄露给其他对象 别的线程就有可能访问这个半成品对象,不安全,不可取
可以接受的做法是 先构造 然后需要使用回调函数的话 用一个成员函数来定义 届时再去调用它即可
class Foo : public Observer
{
public:
Foo