同进程内各线程间用消息传递数据,用什么方式好些。动态数组指针,record指针,对象名?关键是要当作全局的内存变量来使用;内详,期待关注...(300分)

  • 主题发起人 主题发起人 shangshang
  • 开始时间 开始时间
用一个内存块链表来管理你遇到的问题,在驱动开发里,可以用looksidelist,也称为后备链表。原理是预先估计你的程序将使用的最大内存量,申请一个这么大的内存块,然后把大内存块等分为n个小块,用链表进行管理,需要内存的时候就直接查询链表中空闲的数据块,找到后把空闲位置为非空闲状态,内存用完后再把非空闲状态置为空闲状态,这样不用频繁的申请和释放内存。在linux内进程间通讯,我都用共享内存加信号量实现这种方案。你的线程在同一个进程内,直接用临界区+我所说的内存池就可以了。
 
flamingo有点偏激,不过也有道理的。
多线程的程序如果处理数据量有限,没有什么关系,怎么做都可以了。
另外还有一个问题:多线程的程序在多CPU上跑就会有严重的内存操作性能问题的。有兴趣你可以去找一台多CPU的服务器去测试看看。
使用内存池,可以根据你的纪录的大小,并添加一个Flag,表明该数据是否被用还是没有被用,也可以采用两个指针计数来做。
我现在的做法是多进程来提高性能。 :D
 
谢谢 爱元元的哥哥,Kingron, 同时也很感谢 flamingo 的批评评价.
我的确是刚开始写socket通讯才两个月,确实是低水平,:)
以前一直做MIS的,偶尔做些工具.没仔细考虑过这方面的问题,
在做这个程序的时候,因为没什么可参考的,只是自己翻了些资料和讨论,
自己构思设计出的这些处理方法,就因为自己没把握,所以才希望各位指出问题,
能教我一些成熟的处理方法,我更感激不尽.
我是抱着学习和接受批评的想法提出这个帖子的.请各位有什么想法,尽管敞开了说.
to:爱元元的哥哥,我现在用的TThreadList来管理已分配的内存,不过没有预分配空间,因为我的每个包都是不定长的,长度最大值虽然可以估算,我怕不可靠,所以...呵呵.
另外往threadlist增加是不限制的,也就是允许一直增加,不考虑内存承受不了的极限.
这样做是不是不太好呢?
我还想明白一下内存碎片的原理和后果.
to:kingron 你说的内存池的使用方式应该是和爱元元的哥哥的方法类似的,也最好确定每块的大小吧.
 
最好的解决方案是动态增长的内存池

虽然封包的长度不能确定,但在所有通信的封包中肯定有一个封包的长度是最大的,使用动态增长的内存池能正好使被分配的内存达到封包所需要的最大临界值。这样即不会浪费空间也不会频繁得创建与释放内存,因为内存只有在空间不够的时候才重新被分配一次,如果空间足够那么将一直使用原来的那块内存空间。
 
不说了,其实你也挺不错的,我也已经说话很客气了。

在最初 kingron 提出的东西后我就知道你没法摆过来弄,不是 kingron 的方法有问题,而是他也忽视了整体结构对方法移植的难度,里面其他一些捧场的说这说那就不必管他了,链表也是在我说了后才有人提到。

我也不罗嗦了,反正我也没打算在这里帮任何人,看得懂我说的最好,看不懂当我瞎说吧。
 
我现在也是刚开始试着写,如果大侠不想仔细了解我的思路,尽管提示一些完整处理过程,我的代码推翻了重来都行.呵呵.
相信大富翁仍是我辈求学者的天堂.
 
呵呵,想不到火药味有点儿浓烈啊,flamingo大虾应该是位完美主义者,兄弟敬佩。
我想还是楼上那位说的好,没有最好的,只有最合适的,软件写出来本来就是为了用的,好用、够用,那就够了,艺术家有艺术家的活法,泥瓦匠也有泥瓦匠的饭吃:)
 
智者见智,任何方法都有一定的结果.呵呵.谢谢诸位指点.结了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部