(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
多线程下,哪些需要类本身处理资源共享冲突,哪些需要类调用方保证共享冲突。
类对象 与 调用者 各自应该有哪些服务承诺?
下面来探讨探讨。
当我们new一个类对象Object后,该对象存入一个指针中pObject;
该pObject类对象指针的服务承诺有哪些。
我们设计类的时候,可能碰到:
问题是:
我觉的外部调用者需要承诺的比较好定义,除了这部分外,是需要类中应该承诺的。
当然这个也不是绝对的,从通常意义上来总结。
外部调用者来说:
类对象对外的承诺:
有时也可以为了处理方便,把外部使用锁也放在类对象的内部:
例如:
下面这个类对外提供一个外部锁,供外部做某个外部时序处理时使用;
class X
{
public:
// 获取id
uin32_t Get();
// 保存
void Store(info *);
// 获取外部锁
std::mutex* OuterMutex() {return &outer_mutex;}
private:
std::mutex inner_mutex;
std::mutex outer_mutex;
}
假如Store与Get本身都通过inner_mutex支持多线程访问;
但部分情况,我们有外部要求,需要Get调用和Store能够一起做单线程访问约束;
lock();
{Get(); Store(info);}
unlock();
此时我们就可以通过外部锁来实现:在每个调用Get & Store的时候,使用外部锁加锁,当调用完毕Store后,释放外部锁。
x.OuterMutex().lock();
{
uint32_t m = x.Get();
...
x.Store(&myinfo);
}
x.OuterMutex().unlock();
这种对于类的部分函数绑定在一起的单线程访问约束项,就可以由外部调用函数,通过外部锁来实现。
这样不会影响这些函数单独访问时的多线程支撑,Store在不和Get一起时,互相都可以多线程访问。
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)