如果一个类A内含有一个共享指针,指向一个对象。而在另一个线程中,有另一个类B也需要访问这个对象,最常见的方式是让这个类A提供一个接口,返回这个对象的智能指针,由于在多个线程中,所以这个接口必须和类A内其他访问这个共享指针的接口加互斥锁。
但这并不能保证线程安全,因为这个接口返回后,就会有两个线程中的两个句柄指向这个对象,也就是说一个对象的共享指针在两个线程中,这是很常见,却非常危险的行为。对于这种场景,有两个解决方案:
1. 深拷贝
从根源上避免线程互斥问题
2. 互斥锁导出,然后在类B内对类A加锁
[[nodiscard]] auto lock() -> std::unique_lock<std::mutex> {
return std::unique_lock<std::mutex>(m_local_obj_);
}
3. 对指针所指向对象的每个访问接口都加锁
将互斥责任转移给底层