脑子都想破的资源释放问题

tangrh 2004-11-04 03:07:55
我有一个资源池(其实就是内存块啦),每块内存都有一个可用标志(比如小于2就可以使用,大于2表示已占用),在我的程序里对于同一块内存有2个以上的线程在操作(操作不同地方,所以没有问题),现在的问题是,这些线程最后一个完成处理的,必须保证把这块内存再归还到资源池中去,这些线程的结束顺序不定,这次A线程先结束,下次可能是B线程先结束,兄弟迂钝,想破脑子还想不通怎么实现资源的无冲突释放,也就是说最好是后结束的线程来释放(咦,它怎么知道它是最后一个呢),请哪位高人来指点一下,假设这块内存是一个大结构体,可以放一些标志字段。
...全文
120 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tangrh 2004-11-05
  • 打赏
  • 举报
回复
呵呵,两边都关注,谢谢beyondtkl
beyondtkl 2004-11-05
  • 打赏
  • 举报
回复
呵呵 我在VC版也回复了你呀。。
tangrh 2004-11-05
  • 打赏
  • 举报
回复
D版人少嘛,vc的人多啊
beyondtkl 2004-11-04
  • 打赏
  • 举报
回复
这样吧

你线程自己维护自己的已用计数。。。。 当计数为0的时候 就告诉主线程。。。
这样 减少线程间的关联 速度更快。。。 而主线程 只管理 当这N个线程都发了消息的时候 再全部释放

tangrh 2004-11-04
  • 打赏
  • 举报
回复
to 楼上:
我的线程也是从线程池里临时唤醒的,也就是说内存块和线程之间其实没有关系,更重要的是,我的这些线程都不能阻塞太长时间,因为它们都是为异步操作服务的,需要尽快响应,所以不能等事件或者semaphore等东东,用interlockedXXX会不会堵住呢
warmworm 2004-11-04
  • 打赏
  • 举报
回复
共享内存区操作时,必须加锁,别的嘛,应该不用多考虑
beyondtkl 2004-11-04
  • 打赏
  • 举报
回复
想破脑子还想不通怎么实现资源的无冲突释放,也就是说最好是后结束的线程来释放(咦,它怎么知道它是最后一个呢),

// 照你的描述 只要所有线程都结束了再释放就是 中间不释放 只是把相应的状态改变而已
内存池 的作用就是这样。。。到你都不用的时候 再整个释放掉。。。

可以考虑用计数器 -- 这个计数器对所有线程对任意一块的使用标识 用了就+1 用楼上说的Inter...
不用了就-1 当然了 还要设置你里面说的那个标志位。。

你可以定时 去查看这个计数器的值 为0 就。。。。
alphax 2004-11-04
  • 打赏
  • 举报
回复
简单,不用管谁先结束的,用的时候,向池申请,找到引用计数为0的块给他就可以了,如果线程申请某一已经分配的块,就将哪个块的引用计数加1,线程释放块的时候把块的引用计数递减1就行了,当计数为0时,块就是空闲的,下次就可以参加分配了,只是加减的时候要锁定总线,用interlockedXXX系列的api就行了
jinjazz 2004-11-04
  • 打赏
  • 举报
回复
...设个计数器??
tangrh 2004-11-04
  • 打赏
  • 举报
回复
或者有别的好方法搞定也行
相关推荐
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-11-04 03:07
社区公告
暂无公告