开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 11153|回复: 54
收起左侧

[图文资料] 分享我对多线程的理解

[复制链接]
结帖率:92% (11/12)
发表于 2015-11-13 16:07:29 | 显示全部楼层 |阅读模式   浙江省杭州市
最近在写多线程方面的程序,途中经历苦不堪言....也不多说什么,写下我对多线程的理解吧,可能有很多理解的地方不对,如果有什么好的理解,希望告诉我。
一、进程与线程的关系:
    看了一些这方面的书,里面写的很详细,但是很难理解,我总结了下
    ①进程就是一个执行了的程序。
    ②进程包含线程。
二、线程与线程句柄:
    ①线程句柄可以对线程进行挂起、恢复、结束等操作。
    ②线程句柄是线程创建时会返回的一个整数型数据。
三、线程的操作:
    ①挂起:简单点说就是把暂停线程,先不让它执行;专业的说CPU不给线程分配CPU资源,但是线程还是占有内存资源,也就是说线程被挂起但还是存在。
    ②恢复:简单理解就是继续线程这是相对挂起的线程来说的,挂起后你还希望线程之后运行,再把它恢复,这时CPU就会给它分配CPU资源。
    ③结束:这个就像关闭程序似得,系统把线程给关闭了;专业的说,CPU不再给线程分配CPU资源,而且内存资源也被销毁了。

四、多线程的注意事项
    ① 多线程是不是越多越快,这需要看运行程序的计算机性能,性能高的人自然是越多越快,但是性能差的计算机,使用大量线程,就会导致CPU高峰,从而造成线程堵塞,如此而来运行速度更慢了,所以什么性能的计算机需要与线程数配对。
    ②
线程的执行顺序不一定是按照创建时的顺序执行的,因为CPU处理线程是不确定的顺序。
    ③
如果线程需要对窗口组件操作,那么尽量使用许可区(许可区后面我会详细的介绍的,因为这个东西很重要)如果不使用的话,可能会引起程序错误等情况,而这个错误是随机的。(目前为止我只知道用许可区会降低出错概率,但没找到直接又安全的调用窗口组件的方法,有大神了解的话,麻烦告诉一下,谢谢)
    ④读写共享资源时最好使用许可区,此点与三-③一样,如果能清晰明了的判断不使用许可区也没问题的话,可以选择不使用。
五、许可区 (临界区)
    ①什么是许可区,简单的理解,就是一段代码,该代码需要被多个线程调用,但同时仅能让一个线程调用。
    ②根据五-①的要求,如果多个线程同时需要进入许可区访问该代码,一次只能允许一个线程进入访问,其他线程将会被挂起,等待进入的线程访问完毕退出许可区再进入。所以,如果整个线程都在许可区里,那么看似是多线程实际上是单线程在执行。
    ③根据五-②的要求,多线程
需要避免经常出现进入需等待的许可区,因此许可区的代码需要有执行速度快的特点,也就是执行该代码耗时小,这样就会避免线程被挂起等待现象
    ④第四项经常说道访问共享资源时尽量使用许可区,因为如果多个线程同时在访问全局变量A时,会出现计算错误,比如所有线程都要操作A=A+1,局部变量B=A-1
,就会出现线程C已经执行完A=A+1了但还没执行B=A-1时线程D就在执行A=A+1了,这样就出现了计算错误。此时需要用的许可证在访问变量A之前进入许可区,访问完毕再退出许可区。代码就可以写成这样:进入许可证(许可证),A=A+1,B=A-1,退出许可证(许可证)。这样线程C进入许可证后,之后的线程将会自动挂起,等待线程C退出许可证后,之后的线程就自动恢复并进入许可证。
    ⑤这里我说一个坑,估计大家都会犯这个错误,我也在这个误区里蹲了不少时间。在访问共享资源,进入许可区时,要使用同一个许可区,如果多个线程使用各自的许可区进入,那么这就没有意义了。因为一个许可区只能让一个线程进入,多个许可区不就多个线程都能进入了吗,那此时许可区就无意义了。
    ⑥许可区的唯一缺点:就是不知道我是否真正进入该许可区
以上就是我对多线程的理解



接下来再讲讲多线程程序调试时没有问题,但是编译出来后就会出现程序崩溃的原因。
一般出现这种情况多在生成了程序后,调试时候数据不太多一般察觉不到。其原因是多线程对于双核CPU亲和性上的问题
解决方案很简单
.版本 2
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号

    .参数 hProcess, 整数型
    .参数 hProcess, 整数型

.DLL命令 SetThreadAffinityMask, 整数型, , , 公开, 设置CPU亲和性 线程句柄
    .参数 hProcess, 整数型
    .参数 Mask, 整数型

.DLL命令 GetCurrentProcess, 整数型, , , 公开, 获取当前进程的一个伪句柄 一般是-1

      
.DLL命令 GetCurrentThread, 整数型, , , 公开, 获取当前线程的一个伪句柄 一般是-2

导入好这些dll后
在程序运行前加入该代码
SetProcessAffinityMask (-1, 1)就OK了

点评

说了那么多,希望能够加深你对多线程的了解   安徽省合肥市  发表于 2022-3-13 10:54
ekO
线程转窗口 可以用中转变量的方式交给窗口去加载数据 或者通过标签事件 传递给窗口机制去处理   贵州省遵义市  发表于 2016-5-9 10:07

评分

参与人数 5好评 +3 精币 +14 收起 理由
小翁哥哥 + 1 + 2 很不错谢谢分享
Cand + 1 + 5 感谢分享,很给力!~
精易自媒体 + 3 此处应该有鼓励~
冰点 + 1 + 3 感谢分享,很给力!~
城市浪子 + 1 感谢分享,很给力!~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:91% (21/23)
发表于 2016-3-22 23:08:22 | 显示全部楼层   湖南省怀化市
学习下理论。。
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2016-3-25 17:41:52 | 显示全部楼层   广东省广州市
讲的挺好的  很容易理解
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2016-3-26 10:34:21 | 显示全部楼层   福建省福州市
很不错!!
回复 支持 反对

使用道具 举报

发表于 2016-3-26 14:07:32 | 显示全部楼层   广东省潮州市
可以可以
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)
发表于 2016-3-26 14:32:14 | 显示全部楼层   广东省深圳市
SetProcessAffinityMask (-1, 1)算是明白这句代码的意思了
回复 支持 反对

使用道具 举报

结帖率:96% (54/56)

签到天数: 19 天

发表于 2016-3-26 21:38:45 | 显示全部楼层   江西省萍乡市
佩服楼主,看这么一大堆的理论...
回复 支持 反对

使用道具 举报

结帖率:97% (97/100)

签到天数: 20 天

发表于 2016-3-27 21:19:28 | 显示全部楼层   江西省吉安市
设置cpu亲和性后就变单核运行了
回复 支持 反对

使用道具 举报

发表于 2016-3-29 16:06:13 | 显示全部楼层   云南省昆明市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:94% (15/16)

签到天数: 1 天

发表于 2016-4-2 18:26:07 | 显示全部楼层   河南省平顶山市
MARK....................
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表