多个类的多个共享变量需要互斥访问,该如何设计互斥方式

hoya5121 2009-02-08 03:09:44
结构是这样的:
有多种实体类,如CLine,CArc
有一个实体集合类管理所有实体,CObjectMgr,其中有实体数组作为成员存储所有实体
实体集合类提供获得实体指针的函数,取出实体指针后,可调用实体的成员函数对其进行修改和访问

现在要在多个线程中使用实体集合来获得实体指针,进行操作.
我现在采用的方法是在每个实体类的所有成员函数中加如互斥锁,使用mutex,这样递归调用也可以
但是随着工程的膨胀和开发人员的增加,不能很好的保证每个实体类的成员函数都自觉调用互斥锁

我想问问大家有没有什么好的设计
...全文
288 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅文海 2009-02-09
  • 打赏
  • 举报
回复
和第一个方案相似的还有一个方案,也是用宏解决的,不过那个比这个要差一些,这里就不说了
梅文海 2009-02-09
  • 打赏
  • 举报
回复
解决方案一:
该方案解决 50% 的问题
编写一个类:如下:
class CSync{
public:
void CSync(){Lock();}
~CSync(){Unlock();}
}
编写一个宏,如下:
#define SYNC_CODE CSync sync_object;

要求写代码的人在每一个函数的时候先加入这一句,但是别人不加也没办法,解决 50%

解决方案二:
// 参数基类(这个类的派生类具体要放什么数据你不用管)
class CParaBase{
public:

};

// 对象基类
class CObjectBase{
public:
virtual CParaBase* RealGetItemOfIndex(int i){
CParaBase* p=NULL;
Lock;
p=GetItemOfIndex(i);
return p;
}
virtual void RealAdd(CParaBase& a) 同上
virtual void RealDelete(int i) 同上

protected:
virtual CParaBase* GetItemOfIndex(int i)=NULL;
virtual void Add(CParaBase& a)=NULL;
virtual void Delete(int i)=NULL;
};

梅文海 2009-02-09
  • 打赏
  • 举报
回复
针对你的问题我仔细想了一下,我下面说一下
taodm 2009-02-09
  • 打赏
  • 举报
回复
那就不要把对象指针放出去。直接提供服务。
hoya5121 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 amei2000go 的回复:]
你可以用纯虚类来解决这个问题,访问方法都弄成虚拟的,参数也弄成虚类
[/Quote]

你这样的话,数据太抽象,别人是不是加一个简单类型的成员也要派生一个类呢
hoya5121 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
可以让每个线程需要使用集合类对象时,自己加锁....头文件注释中等加以说明
[/Quote]

你这个方法好像不太好吧,比如界面线程中多个函数,每个函数可能由不同的人员维护,难免会有漏加的地方
梅文海 2009-02-09
  • 打赏
  • 举报
回复
补充一下,这样你就可以不用在新设计的类中调用 Lock/Unlock 了,但是你的编码中需要这样调用:

Lock();
GetItemOfIndex...
Unlock();



Lock();
Add(...
Unlock();
梅文海 2009-02-09
  • 打赏
  • 举报
回复
你可以用纯虚类来解决这个问题,访问方法都弄成虚拟的,参数也弄成虚类
例如:

// 参数基类(这个类的派生类具体要放什么数据你不用管)
class CParaBase{
public:

};

// 对象基类
class CObjectBase{
public:
virtual CParaBase& GetItemOfIndex(int i)=NULL;
virtual void Add(CParaBase& a)=NULL;
virtual void Delete(int i)=NULL;
};
oyljerry 2009-02-08
  • 打赏
  • 举报
回复
可以让每个线程需要使用集合类对象时,自己加锁....头文件注释中等加以说明
deerwin1986 2009-02-08
  • 打赏
  • 举报
回复
帮顶!~
太乙 2009-02-08
  • 打赏
  • 举报
回复
先说说你的设计,然后再评价好与不好

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧