c++ - 线程安全对象的包装类是否也需要成为线程安全的?

标签 c++ multithreading thread-safety

[我没有找到任何令人满意的答案,因此发布了一个问题。]

假设我有一个线程安全的 C++ 类“ThreadSafeClass”。现在,我在它上面写了一个包装器“MyWrapper”。 MyWrapper 没有任何其他数据成员。我这里有几个疑问:

  1. 此包装类的各个方法是否也需要受互斥体保护以使其线程安全?或者可以安全地假设,因为底层对象是线程安全的,所以没有必要?
  2. 如果上面 <1> 的答案是否定的(包装器中不需要互斥体),那么请考虑这一点:我们不通过任何互斥体保护包装器类,假设对唯一底层对象的访问始终是线程安全的。现在假设 1 个线程位于包装器对象的析构函数中,而另一个线程正在访问其成员函数(假设包装器类没有任何互斥体来避免这种情况)。是否有可能线程安全对象已被一个线程销毁,然后另一个线程尝试访问它?我知道这听起来有点奇怪,很可能我错过了一些东西,但这取决于上面 <1> 的答案。

    class MyWrapper {
    private:
        ThreadSafeClass _ts_obj;
    public:
        void foo()
        {
            _ts_obj.do_something();
        }
    };
    

最佳答案

  1. 不,在给定的场景中,您不必使用额外的互斥锁来保护您的包装类

  2. 当多个线程使用同一个对象时,您应该非常小心地管理对象的生存期,以便一个线程无法在其他线程访问该对象时销毁该对象。最简单的方法是使用 shared_ptr<Wrapper>线程中的智能指针来访问数据。这是线程安全的引用计数智能指针,一旦没有从任何线程引用该对象,该指针就会销毁该对象。

关于c++ - 线程安全对象的包装类是否也需要成为线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323032/

相关文章:

c++ - 引用或指针更快吗?

c++ - 重载不明确(int -> int64_t vs int -> double)

Rust 的 proc 宏的 C++ 替代品

java - 使用线程时 Swing GUI 不显示

java - 跨线程访问异常: How to implement?

java - 多线程异常处理释放资源

c++ - 如何延长成员引用的生命周期?

java - 使用不同的唯一 id 提高每个线程的性能

c++ - boost asio 行为 - 从多个线程调用 ios_service::run

java - 如何确保两个线程访问相同的资源并使它们线程安全?