gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:58 30 4
gpt4 key购买 nike

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

假设我有一个线程安全的 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com