睢闫网络为您打造全面营销系统,营销网络建设第一品牌!
验证码: 看不清?点击更换
注册
签到 网页翻译为英文
1823-8012-605

营销型网络系统 顶级核心团队

让传统企业获得更多的订单和询盘!

您现在所在的位置:主页 > 网站建设

分享我对多线程的理解

时间:2016-01-23 10: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了

下载此文章
联系方式

中国 · 睢县 · 建设路天湖城1005号

公司: 睢闫网络传媒有限公司

电话:1823-8012-605

邮箱:732541231@qq.com

QQ在线咨询

商务服务或业务咨询请点击以下QQ头像

网站建设-点击洽谈

数据库系统-点击洽谈

其他项目-点击洽谈

至电顾问需求或技术支持

需要做项目或需要技术支持业务请来电,谢谢!

18238012605 -郑经理

18336092044 -李经理

18671257743 -艾经理

告诉我们您的需求

在线填写需求,我们将尽快为您答疑解惑。

业务咨询QQ:732541231

售后服务QQ:732541231

电话:1823-8012-605

工作时间 9:00 ~ 18:00

工作日(周一至周五)

我们将在1个小时内回复,资料会保密处理。