多线程访问堆对象
大家好!今天我给大家介绍一下在多线程中访问堆对象的方法。在这次的测试代码中,我会创建两个子线程,其中一个会不断的将堆上的内存重新分配为2048个字节,而另一个则会将堆上的内存重新分配为8个字节。在主线程的main函数中,循环获取当前已分配内存的大小并输出获取到的值。为了让程序能够正常结束,main函数中仅获取60次即自动结束程序。如果您觉得这篇教程有帮助,请为我投上宝贵的一票(顺便求个关注),谢谢!
创建项目和定义线程回调函数
首先,打开VS2017,新建一个名为“MemoryMgtDemo5”的“Windows控制台应用程序”项目。然后在main函数之上,定义两个线程回调函数onFirstThread和onSecondThread。在这两个函数中添加线程函数的while循环框架代码。循环中需要的结束标记变量可以定义为全局变量,这样在main函数中,可以通过控制该变量的值结束线程循环,令其正常退出。同时,为了在所有线程中都能访问进程默认堆和该堆上分配的内存,需要将这两个变量也定义为全局变量。
获取进程默认堆和分配内存
在main函数中,先获取进程的默认堆,然后在其上分配512字节的内存空间。接下来,创建两个线程,并通过一个循环获取当前已分配内存的大小。完成循环代码后,将线程退出标记置为TRUE,并调用Windows API函数WaitForMultipleObjects等待两个子线程正常退出。
重新分配堆内存
代码编写完毕后,调试运行程序,确认程序可以正常工作。由于此时子线程中什么也没做,因此程序会持续打印512字节的内存大小。然后关闭控制台窗口,返回到onFirstThread函数中,在该函数中,以同步方式重新分配_gsMem内存空间为2048个字节。接着,在onSecondThread函数中添加使用HeapLock和HeapUnlock互斥访问默认堆以及重新分配内存大小为8字节的代码。对于默认堆而言,默认就是互斥访问的,因此在调用HeapReAlloc函数时可以无需指定HEAP_NO_SERIALIZE标记以及使用HeapLock来锁定默认堆。
测试多线程访问堆对象
填写完代码后,再次调试运行程序。在弹出的控制台窗口中,可以看到交替打印的2048字节和8字节内存大小,表示两个线程均在正常工作。
总结
Windows API中堆函数部分的基本用法已经介绍完毕,不过其中还有很多细节需要仔细阅读并编写实践代码才能更好地理解。希望你以此为基础继续努力学习,Enjoy!
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。