- 主题:求推荐内存池crate
使用场景:
1.单线程内部
在同一个线程中预先申请4096个对象的内存池。然后在这个池中获取一个对象,使用,然后释放回内存池中。
2.垮多线程
在线程A中创建一个包含4096个对象的内存池,然后在这个池中获取一个对象,把这个对象发送到线程B中,使用,并在线程B中释放回内存池中。
求推荐合适的crate。稳定,性能高最好。
--
FROM 117.133.52.*
为什么这些场景需要内存池,具体讲讲
【 在 chunhui 的大作中提到: 】
: 使用场景:
: 1.单线程内部
: 在同一个线程中预先申请4096个对象的内存池。然后在这个池中获取一个对象,使用,然后释放回内存池中。
: ...................
--
FROM 221.222.21.*
因为要反复申请释放同样的对象。为了快和减少内存碎片。
【 在 AlphaO 的大作中提到: 】
: 为什么这些场景需要内存池,具体讲讲
--
FROM 111.196.134.*
对象大小都固定吧,申请10个,用后重用不丢弃,是不就行了?用channel传递
【 在 chunhui 的大作中提到: 】
: 因为要反复申请释放同样的对象。为了快和减少内存碎片。
--
FROM 221.218.139.*
对,就是这种用法。线程内的不提了,这个简单。关键怎么跨线程回收。自己实现有简单办法么?
【 在 AlphaO 的大作中提到: 】
: 对象大小都固定吧,申请10个,用后重用不丢弃,是不就行了?用channel传递
--
FROM 111.196.134.*
下面这种范式应该对两个场景都适用吧
// 线程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.*
这样是可以工作的。但是这样每个线程都需要一个通道。我开始的思路是像c语言中一样
总体:
生成一个pool
A线程:
从pool中拿出来一个buff,初始化,放点东西。然后传给B线程,或c线程
B线程:
收到一个buff。干点什么。释放(这个释放并不需要再通过通道传回来)
【 在 AlphaO 的大作中提到: 】
: 下面这种范式应该对两个场景都适用吧
: // 线程A,用完后发送buffer回线程A
: {
: ...................
--
FROM 111.196.134.*
A传给B总需要一个媒介,通道、或某种信号、或全局变量
要是不关注安全性(或者你能保证线程间的安全性),类似C的全局变量unsafe使用static mut,不知道是你需要的不
【 在 chunhui 的大作中提到: 】
: 这样是可以工作的。但是这样每个线程都需要一个通道。我开始的思路是像c语言中一样
: 总体:
: 生成一个pool
: ...................
--
修改:AlphaO FROM 1.202.157.*
FROM 1.202.157.*
肯定是需要传递。过程基本上是:A从池中申请,通过通道传给B,B用完后释放。 如果能在B中直接释放最好,c中的项目也是这么用的。你说这个办法,需要传回给A来释放。相当于多一个通道。
还有个办法就是把pool 让A B共享。B在自己线程中释放进pool。但是这需要pool里面各种锁控制。比较麻烦,所以我看看有没有现成的实现。
【 在 AlphaO 的大作中提到: 】
: A传给B总需要一个媒介,通道、或某种信号、或全局变量
: 要是不关注安全性(或者你能保证线程间的安全性),类似C的全局变量unsafe使用static mut,不知道是你需要的不
--
修改:chunhui FROM 111.196.134.*
FROM 111.196.134.*
第一个通道方式似乎已经相当于丢回池子了
【 在 chunhui 的大作中提到: 】
: 肯定是需要传递。过程基本上是:A从池中申请,通过通道传给B,B用完后释放。 如果能在B中直接释放最好,c中的项目也是这么用的。你说这个办法,需要传回给A来释放。相当于多一个通道。
: 还有个办法就是把pool 让A B共享。B在自己线程中释放进pool。但是这需要pool里面各种锁控制。比较麻烦,所以我看看有没有现成的实现。
:
--
FROM 114.254.10.*