作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
[我没有找到任何令人满意的答案,因此发布了一个问题。]
假设我有一个线程安全的 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/
我是一名优秀的程序员,十分优秀!