[Windows] windows系统编程笔记

#1 ============== 进程管理 ==============

(API)创建一个进程:CreateProcess

Windows下不会维护父-子进程的关系。不像unix中那样会牵扯到会话首进程、僵尸进程之类的。

(!!!)对线程句柄的关闭不会终止线程,因此在创建完线程后可以直接关闭句柄。

在创建进程时可以指定一个是否继承句柄的参数,如果true,则会集成父进程所有已经打开
的句柄的副本,比如文件、内存映射等等。

unix下的fork不适用与多线程场景。

Windows下CreateProcess 约等于  Unix下的 fork + execl

上面提到了子进程可以选择集成父进程的所有打开句柄,这是有前提的,那就是句柄创建时的
内核对象安全属性中包含了可集成属性。

(API)获得当前进程句柄:GetCurrentProcess
(API)获得当前进程ID:GetCurrentProcessId

注:Windows环境下的HANDLE是操作系统层面唯一的,因此存在句柄泄漏的情况,但是对于同一个文件
    很多进程都会打开它,每个进程都会有一个文件HANDLE,这个HANDLE 和 文件就不是 一一对应的
    关系,而是一对多。
    此外,子进程从父进程集成而来的句柄是原句柄的“副本”,是有自己的HANDLE编号的,不会和原来
    父进程句柄的HANDLE编号重复。
    
(API)复制句柄:DuplicateHandle            //句柄编号不一样,只是句柄代表的资源是一样的


(API)进程退出:ExitProcess
(API)获取进程退出码:GetExitCodeProcess
(API)在一个进程中终止另一个进程:TerminateProcess             //要求被中的进程在创建是指定了PROCESS_TERMINATE安全访问权限


如果在__try中调用ExitProcess,那么__except和__finally都不会被执行。


(API)等待进程终止(windows下的所有资源都能用它来设置阻塞):WaitForSingleObject                //传入进程句柄即可
(API)等待多个进程终止:WaitForMultipleObjects
(API)获取环境变量:GetEnvironmentVariable
(API)设置环境变量:SetEnvironmentVariable


CreateProcess时指定PROCESS_TERMINATE,可以控制当前进程不会被其他进程通过TerminateProcess终止

(API)获取进程执行时间:GetProcessTimes        //通过参数返回数据,可以获得进程消耗的所有时间,包括内核态和用户态
(API)获取线程消耗时间:GetThreadTimes

#2 ============== 线程 和 调度 ==============

(API)挂起线程:SuspendThread
(API)恢复线程:ResumeThread

所有使用全局变量 和 堆的代码段都不是线程安全的。

C库不是线程安全的,比如strtok会使用全局变量,因此在多线程场景下使用C库存在一定的风险。像printf,strcpy等等这些都是标准C库,
具体可参照 c99 等一系列C库标准。
Windows下提供 LIBCMT.LIB 这么一个库来作为非线程安全的C库的替代品,LIBC 代表是 C库的等价库,MT代表 Mutithread库,
对应编译选项的 /MT 和 /MD (虽然名字里有MT,但是/MT 和 /MD 都是使用这个名字)

如果使用了 LIBCMT.LIB ,那么就不要在使用CreateThread来创建线程了,这会引入风险,请使用_beginthread和_beginthreadex。
同时线程的终止使用 _endthreadex替代ExitThread。
最终,建议使用 _beginthreadex创建线程,使用_endthreadex结束线程。或者使用return结束线程也可以

(API)创建线程:_beginthreadex
(API)线程自行退出:_endthreadex

(!!!)通常情况下,我们都使用/MD选项,而不用/MT,因此选项要求所有此二进制文件依赖的其他二进制文件在编译时具备相同的配置,
因此大家有一个心照不宣的约定,就是都使用/MD,而不使用/MT,因为某些第三方库的发布如果把c库整个链接仅自己的DLL会把自己
的DLL搞的太大。


(API)设置进程优先级:SetPriorityClass
(API)获取进程优先级:GetPriorityClass

进程可以更改自己的优先级,如果安全权限足够,进程甚至可以修改其他进程的优先级

        PS:windows系统中内核对象的安全权限是一个很重要的部分,后面会详细讨论,所有内核对象都具备安全权限

线程的优先级默认和所属线程一致,可以通过相应的函数设置,设置的方式可以是绝对的或者相对所属进程加/减的。

(API)设置线程优先级:SetThreadPriority
(API)获取线程优先级:GetThreadPriority

线程的优先级被钳定到进程上以后,如果进程优先级改变,则线程优先级也会相应地跟着变化。

(API)开/关进程线程优先级绑定关系:SetThreadPrioirtyBoost


#3 ============== 线程同步 ==============

8.1.4

你可能感兴趣的:(Windows,C++)