2013年4月7日

第八章 用户模式下的线程同步

摘要: (1)什么情况下线程之间需要通信多个线程同时访问一个共享资源,但是不能破坏资源的完整性线程需要通知其他线程任务已经完成(2)原子访问,以及Interlocked系列函数. 所谓原子访问(atomic access)就是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源. LONG InterLockedExchangeAdd(PLONG volatile plAddend,LONG lIncrement)LONGLONG InterLockedExchangeAdd64(PLONGLONG volatile plAddend,LONGLONG lIncrem... 阅读全文

posted @ 2013-04-07 11:48 WillingCPP 阅读(350) 评论(0) 推荐(0)

2013年4月6日

第七章 线程调度,优先级和关联性

摘要: (1)上下文切换 windows在可调度的线程内核中选择一个,并将上次保存在线程上下文的值载入CPU寄存器.(2)windows之所以成为抢占式多进程操作系统,是因为系统可以在任何时刻停止一个线程而另外调度另一个线程.这部分要细细研读,以后再添加 阅读全文

posted @ 2013-04-06 23:05 WillingCPP 阅读(157) 评论(0) 推荐(0)

第六章 线程基础

摘要: (1)线程包括什么?一个是线程的内核对象一个线程栈,用于维护线程执行时所需要的函数参数和局部变量 进程从来不执行任何东西,它只是一个线程的容器。 线程在进程的地址空间内执行代码和处理数据。 每一个线程都有一个上下文,后者包含在线程内核对象中,它反应了执行时cpu寄存器的状态.(2)终止运行线程线程函数结束返回(强烈推荐的)线程调用ExitThread杀死自己(尽量避免)同一进程或不同进程内的线程调用TerminateThread(尽量避免)包含线程的进程终止(避免)(3)线程终止时做什么?线程拥有的所有用户对象句柄会被释放线程的推出代码由STILL_ACTIVE编程ExitThread或T.. 阅读全文

posted @ 2013-04-06 22:30 WillingCPP 阅读(101) 评论(0) 推荐(0)

2013年4月5日

第五章 作业

摘要: (1)作业是什么? 你可以把作业想象成一个进程的容器,作用是限制一组进程的属性。读懂下面的示例函数,就差不多理解了。void StartRestrictedProcess(){ bool bInJob =FALSE; IsProcessInJob(GetCurrentProcess(),NULL,&bInJob); if(bInJob) { Messagebox(TEXT("进程已经存在作业中"),TEXT(""),MB_OK|MB_ICONINFORMATION); return; } HANDLE hjo... 阅读全文

posted @ 2013-04-05 19:17 WillingCPP 阅读(223) 评论(0) 推荐(0)

2013年4月4日

第四章 进程

摘要: (1)什么是进程? 进程是程序的一个运行实例,它由两个部分组成一个内核对象一个地址空间,其中包括可执行文件和dll 的代码和数据,还包括动态内存分配,比如堆栈什么的(2)进程实例句柄 加载到进程空间的每一个可执行文件、dll都有一个独一无二的实例句柄HINSTANCE,也就是程序的基地址,使用的 函数是GetModuleHandle,GetModuleHandleEX(3)进程的的命令行由创建进程时传入,进程还包括一个与它关联的环境块,是一个键值的字符串数组.(4)CreateProcess函数(5)终止进程的四种方法 主线程的入口点函数返回(这个是强烈推荐的方式) 进程的一个线程... 阅读全文

posted @ 2013-04-04 23:46 WillingCPP 阅读(116) 评论(0) 推荐(0)

2013年4月3日

第三章 内核对象

摘要: (1) 何为内核对象:每个内核对象都只是一个内存块,它由操作系统内核分配,并且只能由操作系统内核访问.内存块是数据结构,成员维护着与对象相关的信息.内核对象的生命周期是可能大于创建它的进程,基数机制,如果有进程使用它计数器+1,使用它的进程终止计数器减1,计数器归0,操作系统自动销毁它(类似于com).(2)内核对象的安全性,创建对象的时候有下面这个结构的指针 typedefine _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandler; }SECUR... 阅读全文

posted @ 2013-04-03 13:28 WillingCPP 阅读(170) 评论(0) 推荐(0)

2013年4月2日

第二章 字符和字符串函数

摘要: ---恢复内容开始---(1)首先了解下字符集 ansi, unicode/utf-16,utf-8,utf-32 1字节 2字节 1-4字节 4字节(2)微软的字符数据类型wchar_t,由编译器开关/Zc:wchar_t 决定开启,默认开启,wchar_t t =L"t"; 微软的开发团队还在 winNT.h中定义了 CHAR WCHAR等数据类型 TCHAR WinNT.h中#ifdef UNICODE // r_winnt#ifndef _TCHAR_DEFINEDtypedef WCHAR TCHAR, *PTCHAR;typedef WCHAR TB... 阅读全文

posted @ 2013-04-02 18:01 WillingCPP 阅读(321) 评论(0) 推荐(0)

第一章 错误处理

摘要: 今天开始看windows 核心编程第五版,温故知新,13/4/2,有需要该书电子版的留言(1)常见Windows函数返回值,VOID返回值的函数不可能失败;BOOL失败0,成功非0值;HANDLE 失败NULL或者IVALID_HANDLE_VALUE即-1;PVOID 失败时候为NULL,成功是一块地址;LONG\DWORD 失败通常-1,或0不过这个具体要看说明文档(2)DWORD GetLastError(),返回定义的错误码(WinError.h)。在程序调用失败之后请调用该函数。(3)DWORD WINAPI FormatMessage(__in DWORD dwFlags,__in 阅读全文

posted @ 2013-04-02 15:53 WillingCPP 阅读(110) 评论(0) 推荐(0)

2013年3月31日

深入探索c++对象模型(二)

摘要: (一)关于构造函数 首先讲一个也许会被面试问到的问题,构造函数不能是虚函数,原因如下:运行构造函数的时候,总认为当前正在构造的对象是且仅是本类对象(也就是此时的virtual table ptr指向本类的虚函数表),所以虚拟构造函数没有意义。 构造函数中不能利用到更高级别的重写版本,原因很简答:那部分的成员还没有被构造。 也就是讲虚函数表呢是构造时候建立的,而虚函数表是虚函数实现的基本(参见深入探索c++对象模型(一)),所以矛盾了。 编译器会有默认构造函数,但是要记得,它不会给你的data member 赋你需要的值咯。 阅读全文

posted @ 2013-03-31 21:11 WillingCPP 阅读(108) 评论(0) 推荐(0)

深入探索c++对象模型(-)

摘要: (一) 加上封装后的布局成本 c++在布局 在存取时间上主要的额外负担是有virtual 引起,包括: 虚函数 虚子类虚函数表是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。一般继承(有虚函数覆盖)1)虚函数按照其声明顺序放于表中。2)父类的虚函数在子类的虚函数前面。【父.f】【父.g】【子.f1】【子.g1】一般继承(有虚函数覆盖)1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。2)没有被覆盖的函数依旧。【子.h】【父.g】【子.f1】【子.g1】多重继承(无虚函数覆盖)1) 每个父类都有自己的虚表。2) 子类的成员函数被放到了第一个父类的表中。(所. 阅读全文

posted @ 2013-03-31 14:56 WillingCPP 阅读(195) 评论(0) 推荐(0)

导航

点击右上角即可分享
微信分享提示