摘自(windows核心编程之线程基础)
2014-06-18 16:21
155 查看
线程两个组成部分:
一个是线程的内核对象,操作系统用它管理线程。
一个是线程栈,用于维护线程执行时所需要的所有函数和局部变量。
线程描述了进程内部的一条执行线路。
每次初始化进程时,系统都会创建一个主线程。这个线程首先会执行C/C++运行库的启动代码,后者调用
入口点函数(_tmain或_tWinMain),并继续执行,直至入口点函数返回C/C++运行库的启动代码,后者最终
调用ExitProcess。
每个线程都必须有一个入口点函数,这是线程执行的起点。
主线程的入口点函数:_tmain或_tWinMain.
如果想在主线程中创建辅助线程,它必须有自己的入口点函数。
线程函数可以执行我们希望它执行的任何任务。最终,线程函数将终止运行并返回。此时,线程将终止运行,
用于线程栈的内存也会被释放,线程内核对象的使用计数也会递减。如果使用计数变成0,线程内核对象会被销毁。
线程函数,需注意以下几点:
1.在默认的情况下,主线程的入口点函数必须命名为main,wmain,WinMain或者wWinMain.
与此不同的是,线程函数可以任意命名。事实上,如果应用程序中有多个线程函数,必须为它们
指定不同的名称。
2.因为主线程的入口点函数有字符串参数。所以它提供了ANSI/Unicode版本供我们选择:
main/wmain 和 WinMain/wWinMain.相反,线程函数只有一个参数。而且其意义由我们来定义。
3.线程函数必须返回一个值,它会成为该线程的退出代码。这类似于C/C++运行库策略:
令主线程的退出代码成为进程的退出代码。
//
4.线程函数(实际包括所有函数)应尽可能使用函数参数和局部变量。使用静态变量和全局变量时,多个
线程可以同时访问这些变量。这样可能破坏变量中保存的内容。然而,由于函数的参数和局部变量是在
线程栈上创建的。因此不太可能被其他线程破坏。
CreateThread函数
CreateThread函数是用于创建线程的Windows函数。如果写的是C/C++代码,就绝对不要调用CreateThread.
相反,正确的选择是使用MicrosoftC++运行库函数_beginthreadex.
HANDLE CreateThread{
PSECURITY_ATTRIBUTES psa,//给此参数传入NULL(一般都这样做)
DWORD cbStackSize,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD dwCreateFlags,
PDWORD pdwThreadID};
pfnStartAddr和pvParam
pfnStartAddr参数指定希望新线程执行的线程函数的地址。
线程函数的pvParam参数与最初传给CreateThread函数的pvParam参数是一样的。
dwCreateFlags参数:值为0,线程创建后立即就可以进行调度。值为CREATE_SUSPENDED,系统将创建
并初始化线程,但是会暂停线程的运行,这样线程无法进行调度。
pdwThreadID参数,它必须是DWORD的一个有效地址。
CreateThread函数用它来存储系统分配给新线程的ID。可以为这个参数传递NULL(一般这样做),告诉函数我们对线程ID不感兴趣。
终止运行线程:
<线程函数返回(这是强烈要求推荐的)
线程函数返回:
1.线程函数中创建的所有C++对象都通过其析构函数被正确销毁。
2.操作系统正确释放线程栈使用的内存。
3.操作系统把线程的退出代码设为线程函数的返回值。
4.系统递减少线程的内核对象的使用计数。
如果写C/C++代码:
用_beginthreadex而不要用CreateThread创建线程。
用_endthreadex而不要用ExitThread来终止线程运行。
一个是线程的内核对象,操作系统用它管理线程。
一个是线程栈,用于维护线程执行时所需要的所有函数和局部变量。
线程描述了进程内部的一条执行线路。
每次初始化进程时,系统都会创建一个主线程。这个线程首先会执行C/C++运行库的启动代码,后者调用
入口点函数(_tmain或_tWinMain),并继续执行,直至入口点函数返回C/C++运行库的启动代码,后者最终
调用ExitProcess。
每个线程都必须有一个入口点函数,这是线程执行的起点。
主线程的入口点函数:_tmain或_tWinMain.
如果想在主线程中创建辅助线程,它必须有自己的入口点函数。
线程函数可以执行我们希望它执行的任何任务。最终,线程函数将终止运行并返回。此时,线程将终止运行,
用于线程栈的内存也会被释放,线程内核对象的使用计数也会递减。如果使用计数变成0,线程内核对象会被销毁。
线程函数,需注意以下几点:
1.在默认的情况下,主线程的入口点函数必须命名为main,wmain,WinMain或者wWinMain.
与此不同的是,线程函数可以任意命名。事实上,如果应用程序中有多个线程函数,必须为它们
指定不同的名称。
2.因为主线程的入口点函数有字符串参数。所以它提供了ANSI/Unicode版本供我们选择:
main/wmain 和 WinMain/wWinMain.相反,线程函数只有一个参数。而且其意义由我们来定义。
3.线程函数必须返回一个值,它会成为该线程的退出代码。这类似于C/C++运行库策略:
令主线程的退出代码成为进程的退出代码。
//
4.线程函数(实际包括所有函数)应尽可能使用函数参数和局部变量。使用静态变量和全局变量时,多个
线程可以同时访问这些变量。这样可能破坏变量中保存的内容。然而,由于函数的参数和局部变量是在
线程栈上创建的。因此不太可能被其他线程破坏。
CreateThread函数
CreateThread函数是用于创建线程的Windows函数。如果写的是C/C++代码,就绝对不要调用CreateThread.
相反,正确的选择是使用MicrosoftC++运行库函数_beginthreadex.
HANDLE CreateThread{
PSECURITY_ATTRIBUTES psa,//给此参数传入NULL(一般都这样做)
DWORD cbStackSize,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD dwCreateFlags,
PDWORD pdwThreadID};
pfnStartAddr和pvParam
pfnStartAddr参数指定希望新线程执行的线程函数的地址。
线程函数的pvParam参数与最初传给CreateThread函数的pvParam参数是一样的。
dwCreateFlags参数:值为0,线程创建后立即就可以进行调度。值为CREATE_SUSPENDED,系统将创建
并初始化线程,但是会暂停线程的运行,这样线程无法进行调度。
pdwThreadID参数,它必须是DWORD的一个有效地址。
CreateThread函数用它来存储系统分配给新线程的ID。可以为这个参数传递NULL(一般这样做),告诉函数我们对线程ID不感兴趣。
终止运行线程:
<线程函数返回(这是强烈要求推荐的)
线程函数返回:
1.线程函数中创建的所有C++对象都通过其析构函数被正确销毁。
2.操作系统正确释放线程栈使用的内存。
3.操作系统把线程的退出代码设为线程函数的返回值。
4.系统递减少线程的内核对象的使用计数。
如果写C/C++代码:
用_beginthreadex而不要用CreateThread创建线程。
用_endthreadex而不要用ExitThread来终止线程运行。
相关文章推荐
- 《Windows核心编程》读书心得——线程(线程基础)(4)
- 【Windows核心编程】Windows核心编程 -- 线程基础
- 浅尝《Windows核心编程》之线程基础
- Windows核心编程-线程基础
- 《Windows核心编程》读书笔记六 线程基础
- 【windows核心编程】 第六章 线程基础
- 《Windows核心编程》——六 线程基础
- Windows核心编程:线程基础
- Windows核心编程 第六章 线程基础知识 (下)
- Windows核心编程——第6章 线程基础
- 《Windows核心编程》学习——线程基础
- Windows核心编程 线程基础 线程调度、优先级、关联性 用户模式下的线程同步
- WINDOWS核心编程——线程基础
- Windows核心编程 第六章 线程基础知识 (上)
- Windows核心编程(五)线程基础
- 【windows核心编程】 第六章 线程基础
- Windows核心编程 -- 线程基础
- 《Windows核心编程》之“线程基础”
- Windows核心编程 第6章线程基础
- windows核心编程--线程的同步