[我没有找到任何令人满意的答案因此发布了一个问题。]
假设我有一个线程安全的C ++类“ThreadSafeClass”。现在,我已经为它编写了一个包装器“MyWrapper”。 MyWrapper没有任何其他数据成员。我有几个疑问:
如果答案是< 1>上面是否定的(包装器中不需要互斥锁)然后考虑这个:我们不保护包装类通过任何互斥锁,假设访问唯一的底层对象始终是线程安全的。现在假设1个线程在包装器对象的析构函数中,而另一个线程正在访问其成员函数(假设包装器类没有任何互斥锁来避免这种情况)。线程安全对象是否可能被一个线程销毁,然后另一个线程尝试访问它?我知道这听起来有点奇怪,很可能我错过了一些东西,但这取决于< 1>的答案了。上方。
class MyWrapper {
private:
ThreadSafeClass _ts_obj;
public:
void foo()
{
_ts_obj.do_something();
}
};
答案 0 :(得分:3)
不,在给定的情况下,您不必使用额外的互斥锁来保护您的包装类
当多个线程使用相同的对象时,您应该非常小心地管理对象的生命周期,以便一个线程在其他人访问对象时不能销毁该对象。最简单的方法是在线程中使用shared_ptr<Wrapper>
智能指针来访问数据。这是线程安全引用计数智能指针,一旦它没有从任何线程引用就会销毁该对象。
答案 1 :(得分:1)
编辑: 当然,如果强制删除指针下的对象,则会出现分段错误。