游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1634|回复: 3

关于多线程的一个问题,困惑了好久,求助于各位达人

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-5-29 13:44:00 | 显示全部楼层 |阅读模式
事情是这样的,我自己写了一个Module类,它可以根据配置文件在程序启动时决定自己是使用单独的线程还是使用父Module的线程。我现在为可能会被配置为单独线程的所有Module及派生类都加入了线程同步代码,也就是说在它们的所有public方法里都加了锁……这样不管用户怎么配置都能正确运行,但是问题是:
这样做会导致线程同步代码的泛滥!因为有一些Module的派生类是从DLL载入的,可能是别人编写的,所以我希望能把线程封装得更好些,让Module派生类的编写者不需要考虑线程不线程的,使得加锁这些线程操作不会出现在Module的派生类的代码里……
但是想了好久都不知道该怎么办…… [em6]
大家给些建议吧,谢谢了……

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2007-5-29 21:56:00 | 显示全部楼层

Re:关于多线程的一个问题,困惑了好久,求助于各位达人

我认为有两种办法可以一试:
1.使用接口只公开Module的非虚函数,并且简单地在非虚函数里写上同步代码,然后简单调用其功能的真正实现,真正的功能是用虚函数表示的,子类只要复写这些虚函数就可以了。
2.从Module类继承一个类作为其它子类的代理,在代理类的公开函数里写上同步代码,然后简单调用被代理对象的真正实现。在创建Module子类时,确保返回的是代理类而不是这个子类的真正指针(当然你也可能要返回和其子类一样的指针,这时就考虑为这个子类单独写一个代理)

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-5-29 22:02:00 | 显示全部楼层

Re:关于多线程的一个问题,困惑了好久,求助于各位达人

需不需要加锁应该按逻辑而定,不管三七二十一全部加锁效率会十分低下

所以,制作这种很通用,很底层的类,须不需要加锁还是应该由具体实现者决定

我一般是先做些线程安全的数据容器类,写多线程程序是使用这些容器类存放关键数据,代码本身就基本不用考虑线程安全的问题了。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-5-30 15:57:00 | 显示全部楼层

Re:关于多线程的一个问题,困惑了好久,求助于各位达人

谢谢楼上两位。
whb9633,你这两种方法,我的理解是通过模版方法来保护函数调用的过程。如果需要调用的函数都是主程序已知的,那么可以做到,可如果从DLL载入的各个模块之间要互相调用,并且要调用Module类里没有接口的方法,这时Module就没法保护了。

bracelet,没有针对性的加锁效率很低这我是认同的,不过我还是希望能有一种方法让Module子类的编写者不用考虑线程同步的问题,这样可以减少不少负担,而且如果依靠良好的设计来让线程间的通信比较少的话,那么效率的损失可能也并不大,而这样却能减少开发者的很多思考负担。

*^_^*
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表