锁定一个被取消引用的互斥锁是不是不好的行为
Is locking a dereferenced mutex bad behaviour?
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
的同步机制,则只需要更新一段代码。
我想不出为什么"取消引用互斥锁来锁定它"会是一件糟糕的事情,重复自己是一件糟糕的事情。
相关文章:
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在枚举类型上使用std::max是不是一种糟糕的做法
- std::元组大小,是不是错过了优化?
- 拥有相同方法的静态和非静态版本是不是设计不好
- 他是不是很贪婪
- SDL2:移动所有东西而不是使用视图端口是不是很糟糕
- OOP-我是不是把事情复杂化了
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- 在C++代码中使用C风格的注释是不是一种糟糕的做法
- 如果我在C++中使用堆,我是不是做错了什么
- 这个简单但有用的模式是不是太简单了,不可能成为一个真正的模式
- 在C++中,通过引用传递常量布尔值是不是不好的
- 在main.cpp中而不是在头文件中定义函数是不是一种糟糕的做法
- 既然智能指针已经存在,那么使用C型指针是不是已经过时了
- LNK2019:未解析的外部符号;我是不是忘了
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 是不是比较意味着一个分支
- 让子对象引用其父对象而不是指针,这是不是一种糟糕的做法
- 锁定一个被取消引用的互斥锁是不是不好的行为