摘要: 堆非常适合分配大量的小型数据。它是用来管理链表和树的最佳方式。但是它分配和释放内存块的速度比虚拟内存和内存映射文件要慢,而且也无法再对物理存储器的调拨和撤销调拨进行直接控制。一个进程同时可以有多个堆,进程在整个生命周期内可以创建和销毁这些堆。但是,默认的堆是在进程开始运行之前由系统自动创建的,在进程终止后会自动销毁。我们无法销毁进程的默认堆。每个堆都有一个用来标识自己的堆句柄,所有分配和释放内存块的堆函数都会在参数中用到这个堆句柄。我们可以调用如下函数来得到进程默认堆得句柄:HANDLE WINAPI GetProcessHeap(void);创建额外的堆HANDLE WINAPI HeapC 阅读全文
posted @ 2011-08-10 11:29 飞翔荷兰人 阅读(601) 评论(0) 推荐(0) 编辑
摘要: 在同一个可执行文件或dll的多个实例间共享静态数据1.创建自己的段:#pragma data_seg("Shared")LONG g_lApplocatinInstance= 0;#pragma data_seg()当编译器编译这段代码的时候,会创建一个名为Shared的段,并将pragma指示符之间所有带有初始值的变量放在这个段中。变量后面的#pragma data_seg()告诉编译器停止把后面的变量放到Shared段中,而是重新开始把它们放回到默认的数据段中。在visual C++中,编译器还提供了一个allocate声明符,它允许我们将未经初始化的数据放到任何我们想 阅读全文
posted @ 2011-08-10 11:28 飞翔荷兰人 阅读(646) 评论(0) 推荐(0) 编辑
摘要: 当系统创建一个进程并赋予地址空间时,可用地址空间中的大部分是闲置的或尚未分配的。为了使用这部分地址空间,我们必须调用VirtualAlloc函数来分配其中的区域。分配区域的操作被称为“预定”。当应用程序预定地址空间区域时,系统会确保区域的起始地址正好是分配粒度的整数倍。分配粒度会根据不同的CPU平台而有所不同,但是到目前为止,所有的CPU平台都使用相同的分配粒度,大小为64KB。也就是说系统会把分配请求取整到64KB的整数倍。当应用程序预定地址空间的一块区域时,系统会确保区域的大小正好是系统页面大小的整数倍。页面是一个内存单元,系统通过它来管理内存。与分配粒度相似,页面大小会根据不同CPU而有 阅读全文
posted @ 2011-08-10 11:27 飞翔荷兰人 阅读(796) 评论(0) 推荐(0) 编辑
摘要: 以异步方式调用函数为了用线程池来以异步的方式执行一个函数,我们需要定义一个具有以下原型的函数:VOID CALLBACK SimpleCallback( [in, out] PTP_CALLBACK_INSTANCE Instance, [in, out, optional] PVOID Context);然后为了让线程池中的一个线程来执行该函数,我们需要向线程池提交一个请求:BOOL WINAPI TrySubmitThreadpoolCallback( __in PTP_SIMPLE_CALLBACK pfns, __in_out_opt PVOID pv, __in_opt PTP_CA 阅读全文
posted @ 2011-08-10 11:25 飞翔荷兰人 阅读(2968) 评论(0) 推荐(0) 编辑
摘要: 1.打开和关闭设备Windows的优势之一是它所支持的设备数量。就我们的讨论而言,我们把设备定义为能够与之进行通信的任何东西。表1列出了一些设备及其常见用途。表1:各种设备及其常见用途设备常见用途文件永久存储任何数据目录属性和文件压缩的设置逻辑磁盘驱动器格式化驱动器物理磁盘驱动器访问分区表串口通过电话线传输数据并口将数据传输至打印机邮件槽一对多数据传输,通常是通过网络传到另一台运行Windows的机器上命名管道一对一数据传输,通常是通过网络传到另一台运行Windows的机器上匿名管道单机上的一对一数据传输(绝对不会跨网络)套接字报文或数据流的传输,通常是通过网络传到任何支持套接字的机器上(机器 阅读全文
posted @ 2011-08-10 11:24 飞翔荷兰人 阅读(3861) 评论(0) 推荐(1) 编辑
摘要: 等待函数等待函数使一个线程自愿进入等待,直到指定的内核对象被触发为止。DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); DWORD WaitForMultipleObjects( DWORD nCount, CONST HANDLE* lpHandles, BOOL fWaitAll, DWORD dwMilliseconds );时间内核对象创建时间内核对象:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualRes 阅读全文
posted @ 2011-08-10 11:23 飞翔荷兰人 阅读(591) 评论(0) 推荐(0) 编辑
摘要: 原子访问:Interlocked系列函数所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。LONG InterlockedExchangeAdd( LONG volatile* Addend, LONG Value);LONGLONG InterlockedExchangeAdd64( LONGLONG volatile* Addend, LONGLONG Value);上面两个函数:参数Addend 为要递增或者递减的变量的地址参数Value为增量值,可以为负数,表示前一个变量参数递减。LONG InterlockedExchange( LONG 阅读全文
posted @ 2011-08-10 11:19 飞翔荷兰人 阅读(667) 评论(0) 推荐(0) 编辑
摘要: 线程的挂起和恢复DWORDSuspendThread ( HANDLE hThread ); //挂起线程DWORDResumeThread ( HANDLE hThread ); //恢复线程SuspendThread和 ResumeThread 都返回之前的挂起计数。一个线程最多可以挂起MAXIMUM_SUSPEND_COUNT (WinNT.h中定义为127次)。进程的挂起和恢复对于Windows来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得cpu时间。但是我们可以创建一个函数,用来挂起或者恢复进程中的全部线程,这样就能挂起或者恢复一个进程了。参考代码如下:#include 阅读全文
posted @ 2011-08-10 11:18 飞翔荷兰人 阅读(10398) 评论(1) 推荐(2) 编辑

I Love Lina~