锁定一个解除引用的互斥锁坏行为?

时间:2015-07-17 03:21:31

标签: c++ multithreading oop mutex

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....
}

1 个答案:

答案 0 :(得分:2)

这似乎是直接应用SPOT( S ingle P oint O f T ruth),又名DRY( D on R epeat Y 我们自己),single important idea的两个名字。您已经创建了一个访问val的函数,该函数执行一些应该始终伴随访问的任务。除非有一些私有的,特定于实现的原因直接访问成员字段,否则您应该使用您定义的getter方法。这样,如果您更改保护val的同步机制,则只需更新一段代码。

我想不出为什么“解除引用互斥锁来锁定它”的任何原因都是的事情,重复自己 是一件坏事。