多线程介绍

Posted fzxiaoyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程介绍相关的知识,希望对你有一定的参考价值。

进程:系统中正在运行的一个应用程序,在32位系统中,进程占据4GB虚拟机地址空间
64位系统中,进程占据2的64次方的虚拟地址空间
进程组成部份:
1.内核对象:系统用于存放关于进程统计信息的地方
2.地址空间:包含所有可执行模快和DLL模快的代码和数据。还包含动态内存分配的空间。如线程堆栈和堆分配空间

进程只是线程的容器,每个进程必须有至少一个线程。进程中第一个创建的线程称之为主线程

线程:系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务
线程组成部份:
1.内核对象:系统用于存放关于线程统计信息的地方
2.内存堆栈:用于维护线程在执行代码时需要的所有参数和局部变量

使用多线程优点:
1.更好的利用系统资源
2.充分使用CPU空闲时间片断
3.增加程序灵活性
4.同个进程中所有线程共享进程资源

使用多线程缺点:
1.设计更加复杂
多线程在访问共享数据时需要很小心的处理,否则会出现难以发现的Bug.而且错误难以重现,因为线程调度的无序性,某些错误依赖于线程执行时序
2.上下文切换的开销
线程是由CPU进行调度,CPU一个时间片只执行一个线程上下文内的线程.当CPU由执行线程A切换到执行线程B需要产生一系列操作.保存线程A的执行现场,然后载入线程B的执行现场,这个过程称之为"上下文切换"
3.增加更多的资源消耗
内存同步的开销,上下文切换的开销,线程创建和消亡的开销,以及调度的开销

线程的创建
CreateThread 创建线程.创建线程时系统会创建一个线程内核对象,用以统计线程的信息.创建成功,返回一个线程句柄,创建失败返回0.
注意:当不需要线程句柄时,记得CloseHandle
函数原型:
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全相关信息,默认使用NULL
_In_ SIZE_T dwStackSize, //线程堆栈大小,默认使用NULL
_In_ LPTHREAD_START_ROUTINE lpStartAddress,//指向线程函数的指针
_In_opt_ LPVOID lpParameter, //线程参数,如果不需要参数为NULL
_In_ DWORD dwCreationFlags, //线程创建标志,默认为0 创建后线程立即运行 //CREATE_SUSPENDED 创建线程后立即挂起
_Out_opt_ LPDWORD lpThreadId //线程ID,如果不需要线程ID,就为NULL
);

线程的终止
1.线程函数内代码执行完返回,线程自动终止(强烈推荐)
2.通过在线程函数内调用ExitThread自己杀死自己来终止线程(避免使用)
3.进程中调用TerminateThread强制终止线程(避免使用)

第一种:线程函数返回
1.线程函数中所有C++对象都通过其析构函数被正确销毁
2.系统正确释放线程栈使用的内存
3.系统把线程退出代码设为线程函数的返回值
4.系统减少线程的内核对象的使用计数

第二种:ExitThread
当在线程内部调用ExitThread时系统会清理该线程所使用的所有操作系统资源。
但是C/C++资源不会被销毁,会导致产生内存泄露

第三种:TerminateThread
可以杀死任何线程,但由于它是异步访问的,当函数返回时不能确保线程己经终止了,需要等待然后进行判断线程是否己经终止

线程的挂起
SuspendThread 返回线程的前一个挂起计数,如果失败返回-1
注意:调用SuspendThread勿必小心,因为试图挂起一个线程时,有可能会影响到其它线程的运行。比如线程A正在分配堆内存,而此时线程锁定堆,当调用SuspendThread时线程A被挂起,而线程B要访问堆的时候执行就中断,直到线程A恢复时解除堆的锁定后线程B才会继续执行

DWORD WINAPI SuspendThread(
_In_ HANDLE hThread //线程句柄
);

线程的恢复
ResumeThread 返回线程的前一个挂起计数,如果失败返回-1
如果一个线程被挂起三次,那就必须调用三次ResumeThread,才能使线程运行.
反之线程继续处于挂起状态

DWORD WINAPI ResumeThread(
_In_ HANDLE hThread //线程句柄
);

线程的睡眠
Sleep 使线程在一段时间内不需要调度,处于睡眠状态.当超过睡眠时间后,
线程继续执行

VOID WINAPI Sleep(
_In_ DWORD dwMilliseconds //睡眠时间,单位是毫秒 1000毫秒=1秒
);

以上是关于多线程介绍的主要内容,如果未能解决你的问题,请参考以下文章

多线程:多线程设计模式:总体介绍

多线程介绍以及线程池的使用和业务场景

python中多进程/多线程简单介绍

iOS设计中多线程的简单介绍

多线程与多进程介绍

iOS开发多线程篇—多线程简单介绍