[我没有找到任何令人满意的答案,因此发布了一个问题。]
假设我有一个线程安全的 C++ 类“ThreadSafeClass”。现在,我在它上面写了一个包装器“MyWrapper”。 MyWrapper 没有任何其他数据成员。我这里有几个疑问:
- 此包装类的各个方法是否也需要受互斥体保护以使其线程安全?或者可以安全地假设,因为底层对象是线程安全的,所以没有必要?
如果上面 <1> 的答案是否定的(包装器中不需要互斥体),那么请考虑这一点:我们不通过任何互斥体保护包装器类,假设对唯一底层对象的访问始终是线程安全的。现在假设 1 个线程位于包装器对象的析构函数中,而另一个线程正在访问其成员函数(假设包装器类没有任何互斥体来避免这种情况)。是否有可能线程安全对象已被一个线程销毁,然后另一个线程尝试访问它?我知道这听起来有点奇怪,很可能我错过了一些东西,但这取决于上面 <1> 的答案。
class MyWrapper { private: ThreadSafeClass _ts_obj; public: void foo() { _ts_obj.do_something(); } };
最佳答案
不,在给定的场景中,您不必使用额外的互斥锁来保护您的包装类
当多个线程使用同一个对象时,您应该非常小心地管理对象的生存期,以便一个线程无法在其他线程访问该对象时销毁该对象。最简单的方法是使用
shared_ptr<Wrapper>
线程中的智能指针来访问数据。这是线程安全的引用计数智能指针,一旦没有从任何线程引用该对象,该指针就会销毁该对象。
关于c++ - 线程安全对象的包装类是否也需要成为线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323032/