Windows线程(6)
来源:互联网 发布:php可以编译吗 编辑:程序博客网 时间:2024/06/07 22:08
线程有两个组成部分:1.线程内核对象,操作系统用它管理线程内核对象,还在其中存放入一些线程统计信息。
2.线程栈,用于维护线程执行时所需的所有函数参数和局部变量。
进程是不执行任何操作的,它只是线程的一个容器。如果一个进程有两个以上的线程运行,将意味着线程要在共享同一个地址空间。这些线程共享同样的代码、数据,还包括共享内核对象句柄。注意:线程需要的系统资源为一个“内核对象”和一个“栈”。
线程的创建:初始化进程时,system会创建一个main线程。此线程调用运行库启动代码,后者调用入口点函数,并继续执行,直至入口点函数返回运行库启动代码,后者最终调用ExitProcess。
要创建线程,需要先创建入口点函数,这时线程执行的起点。主线程的入口点函数_tmain、_tWinMain。那么自己创建的入口点函数形式如下:
DWORD WINAPI ThreadFUunc(PVOID pvParam){ ...... return 0;}
当线程任务处理完后,会返回,此时线程终止,线程栈被销毁,线程内核对象计数递减,减为0则销毁。入口点函数的返回值会成为该线程的退出代码。
创建线程的函数。1.调用CreateThread函数。此函数调用时,会创建一个线程内核对象。这个对象不是线程本身!这与进程和进程内核对象的关系是相同的。系统从进程的内存空间中分配内存给线程栈使用。新线程和负责创建的那个线程在相同的进程空间上下文中运行。所以,新线程可以访问进程对象的所有句柄、内存以及同一进程中其他所有线程的栈。
不能使用两个线程来执行同一个函数。
终止线程:1.线程函数返回。
2.调用ExitThread函数
3.调用TerminateThread函数(如果调用其,线程的栈将会不被销毁,只能是进程终止时由系统回收)
4.线程的进程终止
线程终止时:1.一个线程会销毁由线程安装和创建的所有窗口,并卸载销毁任何挂钩。其他对象只有在拥有线程的进程终止时才被销毁。
2.退出码由STILL_ACTIVE变为ExitThread或TerminateThread的参数。
3.线程内核对象的状态变为触发状态。
4.如果线程是该进程中最后一个活动线程,系统默认进程终止。
5.线程内核对象使用计数递减1。(当使用计数为0时系统释放其,并销毁其)
其他线程可以调用GetExitCodeThread函数来检查hThread所标识的那个线程是否已经终止运行了。如果已经终止,则可以判断其退出代码是什么:
BOOL GetExitCodeThread( HANDLE hThread, PDWORD pdExitCode);
如果线程尚未终止,则用STILL_ACTIVE来标识,如果调用成功,就返回NULL。
- Windows线程(6)
- Windows线程(6)
- C++线程池(Windows)
- 【Windows】线程漫谈(一)
- 【Windows】线程漫谈(二)
- windows,三个线程(+ ,- ,*);WaiForSingleObject;
- Windows线程
- windows 线程
- Windows线程
- Windows 线程
- Windows线程
- windows 线程
- C#线程篇---Windows调度线程准则(3)
- 【Windows】线程漫谈——线程基础(一)
- 【Windows】线程漫谈——线程栈(二)
- Windows多线程技术研究(三):线程API
- Windows线程(使用Event同步)
- Windows线程(生产者与消费者问题)
- python网络爬虫-API调用至服务器响应
- Android中MVP模式、MVC模式
- 常用正则
- Restful API
- 登录后跳转之前页面
- Windows线程(6)
- caffe使用之——将自己的数据生成lmdb
- 使用正则表达式验证手机号格式
- mysql 删除操作
- ExtJS 6.x 组件xtype一览
- package.json version
- java-springboot-tomcat 搭建
- 详解在 Python 中解析并修改XML内容的方法
- PLSQL Developer 攻略