锁定取消引用的互斥量是不好的行为吗?

Is locking a dereferenced mutex bad behaviour?

c++伪代码class:

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

我很好奇管理数据及其访问的优缺点。 在多线程环境下,使用cbMethodA()中成员mutex的访问和锁定方式是否错误?

我见过直接访问成员的示例,这样做似乎是不正确的。 class 通过 public 方法公开访问是有原因的。 此外,取消引用互斥锁然后将其锁定似乎不是最佳做法。任何意见? 谢谢

 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的直接应用(Single Point Of T露丝),a.k.a。 DRY (Don't Repeat Yourself), [=12=的两个名字].您已经创建了一个用于访问 val 的函数,该函数执行一些应该始终伴随访问它的任务。除非有一些私人的、特定于实现的原因直接访问成员字段,否则您应该使用您定义的 getter 方法。这样,如果你改变保护val的同步机制,你只需要更新一段代码。

我想不出 "dereferencing a mutex to lock it" 会是一件 坏事 的任何理由,重复你自己 一件坏事东西。