第16章 Windows线程栈】的更多相关文章

16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ②调整线程栈的默认大小可以使用编译选项或#pragma指令,具体用法视编译器不同,VC下可以使用 /Fnewsize 编译选项设置默认栈大小,其中newsize是以字节为单位,也可以使用/STACK:reserve[,commit]连接选项,使用#pragma指令的样式如下:#pragma comme…
第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用CreateTimerQueueTimer时,将在Timer线程上创建以APC方式通知的可等待计时器对象,并让该线程在可警告状态下等待定时器的APC.由于这个线程一旦创建就贯穿进程生命期而不会被销毁,因此WT_EXECUTEINPERSISTENTHREAD标志的线程池回调函数也由这种线程执行. ③…
Github https://github.com/gongluck/Windows-Core-Program.git //第11章 Windows线程池.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "第11章 Windows线程池.h" VOID NTAPI SimpleCB( _Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context )…
谈谈windows线程栈. 当系统创建线程时会为线程预订一块地址空间区域,注意仅仅是预订.默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器.默认情况下,仅仅为两个页面挑拨.x86系统下每个页面是4KB.其他页面会在访问的时候由系统调拨.这仅仅是在创建线程时,程序员指定CreateThread的第二个参数StackSize为0时才会发挥作用.如果程序员传入的是非零值,那么调拨的物理存储器的数量就是这个非零值. 这两个默认的页面是从哪里来的呢?原来是在链…
11.2 Win2008以上的新线程池 (1)传统线程池的优缺点: ①传统Windows线程池调用简单,使用方便(有时只需调用一个API即可) ②这种简单也带来负面问题,如接口过于简单,无法更多去控制线程池的行为. (2)Windows2008新线程池及API 线程池对象 传统API Win2008及以上平台新API 普通任务线程池 QueueUserWorkItem CreateThreadpoolWork TrySubmitThreadpoolWaitCallbacks SubmitThre…
11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThreadpoolWait或CreateThreadpoolIo,并使传入参数PTP_CALLBACK_ENVIRON设为NULL时,那么所有的工作项将被添加到进程默认的线程池.一般这个默认的线程池能满足大多数应用程序的要求.其生命期与进程相同,在进程终止的时候,Windows负责线程池的清理和销毁工作. (…
2014-04-27 20:25 题目:关于java中标有synchronized的成员方法? 解法:这代表同一个对象实例的synchronized方法不能被多个线程同时调用.注意有这么多个地方都加粗了,如果这些条件有一个不满足的话,就是可以调用的.另外,如果此方法是静态成员方法, 那么总可以认为是“同一实例”的,因为静态方法就属于一个类,类似于单体. 代码: // 16.6 How do you explain the "synchronized" keyword? There're…
2014-04-27 20:16 题目:假设一个类Foo有三个公有的成员方法first().second().third().请用锁的方法来控制调用行为,使得他们的执行循序总是遵从first.second.third的顺序. 解法:你应该想到了用lock的方法类阻塞,不过这里面有个概念问题使得直接用ReentrantLock不能通过编译(对于一个锁对象,不同在A线程中锁定,又在B线程中解锁,不允许这样的归属关系),可以用Semaphore来达到相同的目的.请看下面的代码. 代码: // 16.5…
2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常一起发生,每件只需要花几纳秒.如果你把A事件连续做几百万次,而B时间只做了几次,这样就能排除B事件对于测量的影响.如果总时间S = mA + nB.当m >> n 时,A≍S / m.下面的测量方法类似于打乒乓球,在主线程和副线程间互相传递一个令牌,这个令牌可以是变量.管道之类的用于通信的工具.与…
2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: // 16.1 What is the difference between process and thread? Answer: Process: . Basic element of resource allocation in the operating system. . Possesses independent resources:…