关键部分或静音是否真的是成员变量,或者何时应成为成员变量

Should a critical section or mutex be really member variable or when should it be?

本文关键字:变量 成员 或者 何时应 真的 键部 是否      更新时间:2023-10-16

我已经看到了代码,其中mutex或临界部分被声明为类的成员变量,以使其线程安全如下。

class ThreadSafeClass
{
public:
    ThreadSafeClass() { x = new int; }
    ~ThreadSafeClass() {};
    void reallocate()
    {
        std::lock_guard<std::mutex> lock(m);
        delete x;
        x = new int;
    }
    int * x;
    std::mutex m;
};

但是,如果多个线程共享相同对象,这是否使其线程安全仅?换句话说,如果每个线程都在创建自己的该类实例,那么它们将非常独立,并且其成员变量将永远不会相互冲突,在这种情况下甚至不需要同步!?

在我看来,将MUTEX定义为成员变量确实会减少与事件的同步,当时相同对象由多个线程共享。如果每个线程都有自己的类的副本(例如,如果类是访问其他全局对象(,则实际上并不能真正使任何线程更安全。这是正确的评估吗?

如果您可以保证只有一个线程才能访问任何给定的对象,则互斥是不必要的费用。但是,必须在班级的合同上有很好的记录以防止滥用。

ps:newdelete有自己的同步机制,因此即使没有锁,也会产生争论。

编辑:您将线程彼此独立越多,越好(因为它消除了对锁的需求(。但是,如果您的课程将与共享资源(例如数据库,文件,套接字,内存等...(大量合作,则具有每线程实例的优势几乎没有优势,因此您不妨在线程之间共享一个对象。真正的独立性是通过与不同的内存位置或资源一起使用的不同线程来实现的。

如果您的锁可能会长时间等待,那么在自己的线程中运行一个实例并从同步队列中拿起"作业"可能是个好主意。