- 主题:求推荐内存池crate
为什么这些场景需要内存池,具体讲讲
【 在 chunhui 的大作中提到: 】
: 使用场景:
: 1.单线程内部
: 在同一个线程中预先申请4096个对象的内存池。然后在这个池中获取一个对象,使用,然后释放回内存池中。
: ...................
--
FROM 221.222.21.*
对象大小都固定吧,申请10个,用后重用不丢弃,是不就行了?用channel传递
【 在 chunhui 的大作中提到: 】
: 因为要反复申请释放同样的对象。为了快和减少内存碎片。
--
FROM 221.218.139.*
下面这种范式应该对两个场景都适用吧
// 线程A,用完后发送buffer回线程A
{
while let Some(buffer) = rx.recv() {
make_use_of(buffer); // 用buffer
tx.send(buffer).unwrap(); // 发送回rx
}
}
【 在 chunhui 的大作中提到: 】
: 使用场景:
: 1.单线程内部
: 在同一个线程中预先申请4096个对象的内存池。然后在这个池中获取一个对象,使用,然后释放回内存池中。
: ...................
--
FROM 1.202.157.*
A传给B总需要一个媒介,通道、或某种信号、或全局变量
要是不关注安全性(或者你能保证线程间的安全性),类似C的全局变量unsafe使用static mut,不知道是你需要的不
【 在 chunhui 的大作中提到: 】
: 这样是可以工作的。但是这样每个线程都需要一个通道。我开始的思路是像c语言中一样
: 总体:
: 生成一个pool
: ...................
--
修改:AlphaO FROM 1.202.157.*
FROM 1.202.157.*
第一个通道方式似乎已经相当于丢回池子了
【 在 chunhui 的大作中提到: 】
: 肯定是需要传递。过程基本上是:A从池中申请,通过通道传给B,B用完后释放。 如果能在B中直接释放最好,c中的项目也是这么用的。你说这个办法,需要传回给A来释放。相当于多一个通道。
: 还有个办法就是把pool 让A B共享。B在自己线程中释放进pool。但是这需要pool里面各种锁控制。比较麻烦,所以我看看有没有现成的实现。
:
--
FROM 114.254.10.*
我觉得pool实现不会比channel更快。
“A需要不断读回传的通道”是什么意思?很让人费解
【 在 chunhui 的大作中提到: 】
: 这样A处理起来稍微有点麻烦。因为A需要不断读回传的通道。不过这样也有好处,就是不需要锁。
: 我说那种B释放的方式表面看起来简单,但是pool内部需要锁控制。我觉着确实可以试试。
: 你说这种回传的方式有实际情况用到过么?有什么坑没有?
--
FROM 1.202.157.*
这不是个问题,b用buffer,那么b用完,发回给b即可。没a什么事
【 在 chunhui 的大作中提到: 】
: 是的,我也觉得pool里面的锁可能慢。
: 就是A得不断地读这个回传的通道把B释放发回来的obj读出来... 我说那种poll方式只需要发给B东西,不需要读B发回来的东西
: :
--
FROM 114.254.10.*
用buffer的是b,等buffer的也是b,你这里的a多余了,没起什么作用,b一直重用这n个buffer
【 在 chunhui 的大作中提到: 】
: 发回给把b,没a什么事?这不成单线程了么?
: 我说的多线程场景是:
: A :有个内存池。收到外部事件。从池中取出obj,根据事件初始化obj。把obj通过通道发给B。
: ...................
--
修改:AlphaO FROM 221.222.21.*
FROM 221.222.21.*
哦,明白了,a、b都等着buffer用,a先用,b后用。
在a、b线程之前,初始创建n个buffer,然后给a
a等buffer,每拿到1个buffer,填充给b
b等buffer,每拿到1个buffer,用完给a
还是应该比内存池好
【 在 chunhui 的大作中提到: 】
: 要这样那就是单线程的池了。这个简单。已有办法。
: 多线程情况:
: 用buff的是b。但buff的内容得a填充。否则就不用a b俩线程了。
--
FROM 1.202.157.*