首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
多线程(一)介绍
时间:
2019-12-18 10:45:57
阅读:
86
评论:
0
收藏:
0
[点我收藏+]
标签:
rmi
时间片
变量
在线
注意
并行
分配
资源
访问
进程:系统中正在运行的一个应用程序
,在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秒
);
多线程(一)介绍
标签:
rmi
时间片
变量
在线
注意
并行
分配
资源
访问
原文地址:https://www.cnblogs.com/fzxiaoyi/p/12058525.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!