1.进程组成:
进程内核对象
地址空间
2.线程组成:
线程的内核对象(一个有线程统计信息构成的小型数据结构)
线程栈
3.进程下的线程共享:
同一个地址空间
执行同样的代码(内部if else 不考虑哦)
处理相同的数据
共享进程内核对象句柄
4.进程加载的流程
.
5.线程的声明实现:
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
DWORD dwResult = 0;
//实现相关业务逻辑
return dwResult;
}
6.创建线程的函数:
CreateThread, 该函数是windows函数,
如果你写的程序用到了C/C++运行库应该使用_beginthreadex函数代替
(一般工作中的开发, 都用到了C/C++运行,所以记住_beginthreadex就好了),原因是不安全(http://blog.csdn.net/morewindows/article/details/7421759)
这篇博客写了具体原因可以参考.
函数原型:
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORDdwCreationFlags,
LPDWORDlpThreadId
);
函数说明:
第一个, 参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个, 参数表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个, 参数表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个, 参数是传给线程函数的参数。
第五个, 参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个, 参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
函数返回值:成功返回新线程的句柄,失败返回NULL。
7.终止线程的运行
1、线程函数返回(推荐)。
2、通过调用ExitThread函数,线程将自行撤消(最好不使用该方法)。
3、同一个进程或另一个进程中的线程调用TerminateThread函数(应避免使用该方法)。
4、ExitProcess和TerminateProcess函数,即包含线程的进程终止运行(应避免使用该方法)。
8.线程函数返回.
正确的线程返回时,可以确保下列事项的实现:
(1)在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。
(2)操作系统将正确地释放线程栈使用的内存。
(3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
(4)系统将递减线程内核对象的使用计数。
8.终止线程函数:
ExitThread和TerminateThread(_beginthreadex和_endthreadex是对应的)
ExitThread结束主调线程(就是调用ExitThread的那个线程).
它释放线程栈的内存,但不释放线程中创建的C/C++内存.
TerminateThread杀死的线程连线程使用的栈都不释放.
第7,8条面试容易被问到