锁定一个被取消引用的互斥锁是不是不好的行为

Is locking a dereferenced mutex bad behaviour?

本文关键字:是不是 引用 一个 取消 锁定      更新时间:2023-10-16

c++伪代码类:

一个简单的类,它有一个成员变量,以及控制对它的访问的互斥对象

我很好奇管理数据的利弊以及访问。在多线程环境中,在cbMethodA((中使用访问和锁定成员互斥的方法是错误的吗?

我看到过直接访问成员的示例,这样做似乎是不正确的。该类通过公共方法公开访问是有原因的。此外,取消引用互斥对象然后锁定它似乎不是最佳实践。有什么意见吗?感谢

 class A
   {
    public:
        A():val(0);
        ~A();
        int getVal(void);
        static void cbMethodA();
        static void cbMethodB();
     private:
        Mutex m_mutex;
        int val;
    }
    int A::getVal(){
    {
       int returnVal = 0;
       lockMutex(m_mutex);
       returnVal = m_val;
       unlock(mutex);
       return returnVal;
    }
 void A::cbMethodA(void *ptr)
{
    A* ptr = static_cast<A*> (ptr);
    //get val
    lockMutex(ptr->m_mutex);
    //read val
    int tempVal = ptr->m_val;
    unlockMutex(ptr->m_mutex);
    //do something with data
}
 void A::cbMethodB(void *ptr)
{
    A* ptr = static_cast<A*> (ptr);
    //get val
    int tempVal = ptr->getVal();
    //process val....
}

这看起来像是SPOT(SinglepointOfTruth(,也就是DRY(Don TRepeatY我们自己(的直接应用,这是一个重要想法的两个名称。您已经创建了一个用于访问val的函数,该函数执行一些应该始终伴随着访问它的任务。除非有一些专用的、特定于实现的原因直接访问成员字段,否则您可能应该使用您定义的getter方法。这样,如果更改保护val的同步机制,则只需要更新一段代码。

我想不出为什么"取消引用互斥锁来锁定它"会是一件糟糕的事情,重复自己是一件糟糕的事情。