是否还需要使线程安全对象的包装类成为线程安全的?

时间:2016-07-12 07:55:39

标签: 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();
        }
    };
    

2 个答案:

答案 0 :(得分:3)

  1. 不,在给定的情况下,您不必使用额外的互斥锁来保护您的包装类

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

答案 1 :(得分:1)

  1. 不,你不需要额外的互斥层。
  2. 如果在两个线程之间共享对象,则需要将对象作为引用/指针传递。在这种情况下,线程析构函数将只清理引用/指针,但是拥有删除对象底层,所以一切正常。如果您将对象作为副本传递,一切都很好。
  3. 编辑: 当然,如果强制删除指针下的对象,则会出现分段错误。