PDWORD pdwThreadID);
《Windows核心编程》P124介绍说应当使用编译器提供的线程创建函数,而不应当直接使用CreateThread。
3 .1CreateThread调用的内核行为
调用CreateThread后,OS进行如下几个动作:
l 生成一个线程内核对象
l 在进程空间内为线程分配堆栈空间
因为线程的环境同于其所在进程的环境,所以创建的线程可以访问进程中的所有资源,包括线程中所有的内核对象。
4 线程销亡
4 .1终止线程的方式:
l 线程函数返回(最好使用这个方式,可以保证:线程种创建的C对象正常析构;OS释放线程堆栈内存;OS将线程的退出码设置为线程函数的返回;系统将递减该线程内核对象的的使用计数器【如果此时还有其他引用……,见下面说明】。)
l 调用ExitThread(不能释放C对象,所以最好不要使用这个方式。另外,如果非要调用也应当调用编译器推荐的,如_endThread【Windows核心编程P127】)
l 同进程内的其他线程(包括主线程)调用TerminateThread(被撤销线程得不到通知,不能释放资源,尽量避免这种方式。另外这个函数是个异步函数,返回时,线程不保证已经被撤销,如果要观察线程是否被撤销,应当使用WaitForSingleObject)
l 包含线程的进程终止(应当避免这种方式)
4 .2线程退出时OS的行为
l 线程内的所有用户对象被释放。
l 线程的退出码从STILL_ACTIVE改为传递给ExitThread或TerminateThread的代码
l 线程内核对象的状态改为“已通知”
l 如果线程为进程中的最后一个线程,则OS将进程当作已终止运行
l 线程内核对象的引用计数器减1(一旦线程终止了,其他引用改线程内核对象将不能够处理改线程的句柄,但是可以通过调用GetExitcodeThread来检查hThread代表的线程是否已经终止运行了。)
5 线程同步
5 .1线程同步的起因以及解决之道
5 .1.1共用资源型:
多个线程需要访问同一个资源的时候,为了保证资源不被破坏,需要线程对资源的访问具有原子性。
5 .1.2依赖型:
一个线程等待另外一个线程某件事情完成后才能执行_可以通过手动事件的方式互相通知。
5 .2线程同步种类细分同步起因
同步种类
同步方法备注
共用资源
多个线程对共用变量做加减操作
互锁函数族之:InterlockedExchangeAdd
共用资源
多个线程对公共变量、指针做赋操作
互锁函数族之:InterlockedExchange ,InterlockedExchangepoint
共用资源
多个线程需要根据对公共变量、指针的判断做操作选择
互锁函数族之:InterlockedCompareExchange
InterlockedCompareExchangePointer
共用资源
复杂数据结构(非单),不适合互锁函数族处理的
用“关键代码”的方式,关键代码中要注意:1、要尽量的快速处理完,以防止其他等待线程等待太长时间 2、线程等待过程中由用户模式切换到内核模式,耗费1000个CPU周期,时间比较长。windows多线程编程3、只能对单个进程中的线程进行同步)
InitializeCriticalSection;
EnterCriticalSection;
LeaveCriticalSection;
DeleteCriticalSection;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49702-3.html
伊凡份子给老萨提鞋的资本都木油
超市摆的很多
我算是写过的