易语言实地培训长期招生 QQ1615457736

乐易论坛

 找回密码
 立即注册

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

导航
导航
培训
培训
产品
产品
易歪歪客服聊天助手——永久免费
验证码识别/打码平台/谷歌人机验证/
阿里云服务器最高¥1888云产品通用代金券我要租广告
易歪歪客服聊天助手——永久免费各类验证码定制,注册赠送¥588礼包,点击领取阿里云服务器低至10元/月我要租广告
易歪歪客服聊天助手——永久免费接码打码最高2000云产品通用代金券我要租广告
查看: 7148|回复: 0
收起左侧

[网络教程] 转,分享我对多线程的理解

[复制链接]
  • TA的每日心情

    2018-11-7 20:28
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2017-3-6 21:07:26 | 显示全部楼层 |阅读模式

    乐易编程网免费注册!抓住机会哦!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    最近在写多线程方面的程序,途中经历苦不堪言....也不多说什么,写下我对多线程的理解吧,可能有很多理解的地方不对,如果有什么好的理解,希望告诉我。
    一、进程与线程的关系:
        看了一些这方面的书,里面写的很详细,但是很难理解,我总结了下
        ①进程就是一个执行了的程序。
        ②进程包含线程。
    二、线程与线程句柄:
        ①线程句柄可以对线程进行挂起、恢复、结束等操作。
        ②线程句柄是线程创建时会返回的一个整数型数据。
    三、线程的操作:
        ①挂起:简单点说就是把暂停线程,先不让它执行;专业的说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了


    易语言实地培训,报名联系QQ 1615457736
    [超强]《易语言软件加密(防破解)技术特训》
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    乐易推荐上一条 /6 下一条

    QQ|网站地图|Archiver|手机版|小黑屋|乐易论坛 ( 湘ICP备19007035号-2 )

    GMT+8, 2020-1-22 04:04 , Processed in 0.117810 second(s), 92 queries .

    Powered by Discuz! X3.4 Licensed

    © 2001-2017 Comsenz Inc.

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