1.1、命令提示符(控制台)是一个软件:如果你的软件设置为控制台用户界面,那么Window会拿命令提示行来运行你的软件。
1.2、如果是窗口的话,Windows就不会来管你,就只是直接加载。
1.3、hPrevInstance:在你的程序中永远都不要使用。
1.4、进程实例句柄:加载到地址空间的每一个执行体或者DLL文件都被赋予了一个独一无二的实例句柄。
1.5、进程在死亡的时候我们需要做一些回收和清理的事情。
1.6、内核对象泄露是会比内存泄露更加麻烦的事情。内存泄露可以通过关闭进程来解决,而内核泄露只能通过重启操作系统来解决。
1.7、使用ExitProcess等等,类似的函数来强制的结束进程是不明智的,这会使得资源无法被回收。
1.8、进程权限:
1.9、进程是完全封闭的。开放一些接口。
1.10、UAC:带过滤表的权限。现在只能在程序的边界上来进行权限的提升。
1.11、UAC会最大限度的来保障用户的安全。
1.12、任何的进程都是由很多个模块构成的。
1.13、进程:进程内核空间、地址空间。
1.14、Main函数也是一个线程函数。
1.15、进程消亡的所有的的当前进程的线程全部退出。
1.16、进程结束主线程退出,主线程退出所有的子线程退出。
1.17、WaitForSingleObject函数等待子线程结束。才会去执行主线程之后的代码,才会去消亡。保证了子线程能够正常的退出。
1.18、在进行多线程参数专递的时候一定要注意。有可能主线程退出的时候子线程还在使用主线程的推栈。而静态成员或者全部变量可以解决这个问题。
1.19、ExitThread函数会立即结束当前线程:会将属于当前线程的栈销毁、但是不会去调用析构函数。这很容易造成内存泄漏。
1.20、_beginthreadex(),新线程的创建建议都使用这个函数进程创建。因为该函数比CreateThread来的安全。而且更加具有移植性。
1.21、_beginthread(),这个函数并没有新建栈,所以不要用。
1.22、SuspendThread(hThread),函数会使得线程的暂停计数加一(Suspend:暂停)、当线程暂停计数不为0的时候,线程就不会进入CPU调度。
1.23、ResumeThread(hThread),而这个函数会使暂停计数减一(Resume:恢复)。
1.24、良好的程序中不应该出现线程的挂起:因为线程的挂起是非线程安全的。
1.25、等待、休眠:线程会放弃掉时间片。
1.26、SwitchToThread()函数会将当前线程的时间片放弃掉,然后将剩余的时间片交给哪些饥饿度高的线程去执行。
1.27、
获取CONTEXT结构体: CONTEXT context; context.ContextFlags = CONTEXT_ALL; GetThreadContext(hThread, &context); _tprintf(TEXT("EBP: 0x%x, ESP: 0x%x, EIP: 0x%x\r\n"), context.Ebp, context.Esp, context.Eip);//选择输出
1.28、全局变量是非线程安全的,在多线程编程中全局变量会造成各种各样的麻烦。
1.29、锁的API(原子操作):InterlockedExchange函数,返回参数以前的值。
1.30、所谓的原子操作就是一句一句的汇编代码。
1.31、上锁就相当于使多线程成为了单线程了。
1.32、当两个或两个以上的线程有数据的共享情况的话,尽量的让其在同一个CPU下运行。
1.33、旋转锁:在一个while中不停的进行循环,直到获准进入这个区域。
1.34、EnterCriticalSection(&gCs),这个函数进入临界区,和死循环有些类似,主要的目的是挡住其他线程,不让其他线程进入当前的这块区域
以保证当前这块代码同一时间只有一个线程在访问。
1.35、数据同步:就是为了避免在访问同一资源的时候发生错误,导致获取到的值是错误的
1.36、锁:
1.36.1、
while(InterlockedExchange((long*)&bUsing, TRUE) == TRUE) //在while循环中一直等待。等待到可执行状态。 { Sleep(1); } //code. InterlockedExchange((long*)&bUsing, FALSE);
1.36.2、
CRITICAL_SECTION gCS;//边界区,关键段。 InitializeCriticalSection(&gCS);//初始化。 DeleteCriticalSection(&gCS); //进程结束时候调用,delete //线程中: EnterCriticalSection(&gCS); //进入临界区 //code. ReleaseCriticalSection(&gCS);//退出临界区
1.36.3、
SRWLOCK gSRW;//_Slim锁 InitializeSRWLock(&gSRW);//初始化,这个只有初始化没有delete。 //线程中,分为独占锁和共享锁: //独占锁方式: AcquireSRWLockExclusive(&gSRW); //code. ReleaseSRWLockExclusive(&gSRW); //共享锁方式: AcquireSRWLockShared(&gSRW); //code. ReleaseSRWLockShared(&gSRW); //这里的独占和共享需要注意的是:在意独占锁方式锁的线程一旦获得准许所有的一共享锁方式锁的线程必须全部退出。 //在以共享锁方式锁的线程在执行的时候,独占锁方式锁的线程不会执行。