锁定取消引用的互斥量是不好的行为吗?
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" 会是一件 坏事 的任何理由,重复你自己 是 一件坏事东西。
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" 会是一件 坏事 的任何理由,重复你自己 是 一件坏事东西。