线程中申请500M左右的内存失败...

daymist 2008-03-28 10:45:44
使用AfxBeginThread启动一个新的线程,没有指定stack size(应该就是继承主线程的设置吧),在新的线程中申请500M左右的内存(CriticalSection已设置),无论是堆栈还是虚拟内存都申请失败,申请代码如下:
虚拟内存方式:
LPVOID memStore = ::VirtualAlloc(NULL , 5600*5600*16 , MEM_COMMIT , PAGE_READWRITE);
或堆栈方式:
LPVOID memStore = ::HeapAlloc(GetProcessHeap() , 0, 5600*5600*16);
这两种方式都无法申请500M内存。

放到主线程中申请这么大空间就没有任何问题。

请教一下各位有没有类似问题的经历?
...全文
343 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdleek 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 daymist 的回复:]
引用 7 楼 daymist 的回复:
引用 6 楼 zzz3265 的回复:
这么大内存建议用 CreateFileMapping 试试


好的,我试一下


coooooooool,内存映射文件居然申请成功,谢谢楼上两位

BTW, 内存映射文件方式下读写的性能如何?比起其他两种内存操作方式怎么样?
[/Quote]
据说很不错,而且省事
zdleek 2008-04-03
  • 打赏
  • 举报
回复
mark
alan001 2008-03-29
  • 打赏
  • 举报
回复
是线程里申请内存喔
Elysium 2008-03-29
  • 打赏
  • 举报
回复
500M的连续内存???
chenyu2202863 2008-03-28
  • 打赏
  • 举报
回复
内存管理 建议看 Windows核心编程
daymist 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 daymist 的回复:]
引用 6 楼 zzz3265 的回复:
这么大内存建议用 CreateFileMapping 试试



好的,我试一下
[/Quote]

coooooooool,内存映射文件居然申请成功,谢谢楼上两位

BTW, 内存映射文件方式下读写的性能如何?比起其他两种内存操作方式怎么样?
jasonshark 2008-03-28
  • 打赏
  • 举报
回复
这么大的内存...不建议通过堆或者虚存直接提交...

你可以先reserve,然后在你的空间中按需要一点点提交,否则系统很容易颠簸,特别是物理内存不太充裕的情况
cnzdgs 2008-03-28
  • 打赏
  • 举报
回复
LZ的问题很像是虚拟地址空间不足,建议在程序刚开始执行时分配,将指针保存为全局变量。
cnzdgs 2008-03-28
  • 打赏
  • 举报
回复
申请大块内存失败一般有两种可能原因:
1、分页文件大小不足,这种情况创建一个文件然后用CreateFileMapping可以解决。
2、虚拟地址空间不足,这种情况最好把是减小要分配的内存块,并应尽早分配内存(例如在程序刚开始执行时分配)。
daymist 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzz3265 的回复:]
这么大内存建议用 CreateFileMapping 试试

[/Quote]

好的,我试一下
Yofoo 2008-03-28
  • 打赏
  • 举报
回复
这么大内存建议用 CreateFileMapping 试试
daymist 2008-03-28
  • 打赏
  • 举报
回复
笔记本上怎么着都是申请失败,但台式机可以通过
daymist 2008-03-28
  • 打赏
  • 举报
回复
我也觉得应该运行正常才对,但memStore返回的总是null...

我当时用的是笔记本,现在换到台式机上跑同样的程序也是可以运行的
zhoujianhei 2008-03-28
  • 打赏
  • 举报
回复
::AfxBeginThread(MyThread, 0, 0, 0, 0, 0);


UINT MyThread(LPVOID lpV)
{
LPVOID memStore = ::VirtualAlloc(NULL , 5600*5600*16 , MEM_COMMIT , PAGE_READWRITE);
if(memStore == NULL)
{
DWORD err = ::GetLastError();
}else
{
::VirtualFree(memStore, 0, MEM_RELEASE);
}
return 0;
}
zhoujianhei 2008-03-28
  • 打赏
  • 举报
回复
运行正常啊。
daymist 2008-03-28
  • 打赏
  • 举报
回复
附上开发环境:VS2003, XP 32bit,4G RAM,系统虚拟内存设置为1024~2048MB

请各位指点
ostrich2fly 2008-03-28
  • 打赏
  • 举报
回复
学习……
daymist 2008-03-28
  • 打赏
  • 举报
回复
赞,学到了很多,我改一下程序。

谢谢cnzdgs
cnzdgs 2008-03-28
  • 打赏
  • 举报
回复
申请内存需要连续的虚拟地址空间,如果你的进程中没有500MB以上的连续的虚拟地址空间,申请内存就会失败(MapViewOfFile也是一样)。
进程的前2GB地址空间是用户模式下使用的。在程序运行过程中,创建线程、LoadLibrary、MapViewOfFile、分配大块内存等可能会把未使用的地址空间分割成若干小块空间,使得最大连续地址空间变小。所以我才建议你“在程序刚开始执行时分配,将指针保存为全局变量”。你先分配好内存只是把这个地址空间占用,当你不使用它时是不需要占用物理内存的,也不需要占用运行时间,唯一的影响是要占用系统分页文件的空间(只是占用)。如果不想占用系统分页文件的空间可以用FileMapping。
daymist 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnzdgs 的回复:]
LZ的问题很像是虚拟地址空间不足,建议在程序刚开始执行时分配,将指针保存为全局变量。
[/Quote]

谢谢。但新的线程中并不是每次都要开这么大的内存,用户不是每次都要执行这段算法。。。有没有什么方法正面解决WORKER THREAD中不能开辟大内存的问题。
加载更多回复(2)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧