高并发内存池测试问题集合1:内存申请的冲突与误用

void* b = ConcurrentAlloc((size_t)257 * 1024);
void *a=ConcurrentAlloc(1);

ConcurrentFree(b);
ConcurrentFree(a);

只创建了一个线程,由于第一次已经超限,所以第二次无法分配

void *a=ConcurrentAlloc(1);
void* b = ConcurrentAlloc((size_t)257 * 1024);
ConcurrentFree(a);
ConcurrentFree(b);

可以看到线程只有一个,由于创建的线程首先分配了1的内存 ,大内存虽然申请了下来,却无法释放

void* b = ConcurrentAlloc((size_t)257 * 1024);

ConcurrentFree(b);

但是大内存其实根本没有申请出来

static void ConcurrentFree(void* ptr)
{
	
	span* span1 = Pagecache::GetInstance()->MapObjectToSpan(ptr);
	size_t size = span1->objsize;
	cout << size << endl;
	if (size > Maxbyte)
	{
		
		span* span1 = Pagecache::GetInstance()->MapObjectToSpan(ptr);
		Pagecache::GetInstance()->_pageMtx.lock();
		Pagecache::GetInstance()->relisttopagecache(span1);
		Pagecache::GetInstance()->_pageMtx.unlock();
		cout << "大内存释放" << endl;
	}
	else
	{
		cout << pTLSThreadCache <<"释放" << endl;
		pTLSThreadCache->deletefreelist(ptr, size);
	}
}

一点内存没给

但是span1也不为空

来一步步检查程序是否正常工作

 

 

 找到问题了,newspan没进去

递归调用一次

 可以发现,申请了128页的内存

进入了普通线程拿内存的逻辑

原因找到了,Maxbyte是32页,就要进入堆分配逻辑,但是Npages-1是128页,导致要进入堆的内存大小远远小于进入堆分配逻辑的要求大小 

将页数修改一下

 仍然不行,因为修改这一项会影响中心缓存的逻辑,如果它要申请70页的内存,直接给堆了,不合理,所以只能改回来

页缓存没有问题,也就是申请没有问题,看看释放的问题,我们会发现size=0,所以无法进入大内存释放逻辑,所以应该赋值一下span->objsize

 

但是,边缘情况失败

 

 

对比报错分界点121

 

与线程内存无关,仅仅是无法处理121字节以上的内存

继续示踪,发现是FetchRangeObj,

GetOneSpan的问题

 

while (start < end)
{
	Nextobj(tail) = start;
	tail = Nextobj(tail);
	start += size;
}

问题来自这个
bytes有问题,从下到上找

span1->n = size;

我的天哪,这个应该是页数啊,是不是按字节算了

调试完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值