TC官方合作论坛

 找回密码
 立即注册
查看: 2575|回复: 9

[已解决] TC5-4.3线程临界区问题

[复制链接]
发表于 2015-4-10 22:10:41 | 显示全部楼层 |阅读模式

马上加入TC

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

x
本帖最后由 PGhuman 于 2015-4-10 22:13 编辑

注释掉 进入临界区 或 注释掉 离开临界区 或者把 离开临界区 放到第 15或20或25 行,调试结果全都一样。。
  1. var handle0=0
  2. var handle=array()

  3. function test_init()
  4.     handle0=criticalcreate()//创建临界区
  5.     for(var i = 0; i < 3; i++)
  6.         handle[i]=threadbegin("aa",i)
  7.         threadwaitfor(handle[i],-1)
  8.     end
  9.     criticaldelete(handle0)//删除临界区
  10. end

  11. function aa(k)
  12.     criticalenter(handle0)//进入临界区
  13.    
  14.     for(var i = 0; i < 3; i++)
  15.         traceprint(k&":"&i)
  16.         sleep(1000)
  17.     end
  18.     criticalleave(handle0)//离开临界区
  19.     for(var i = 0; i < 3; i++)
  20.         traceprint(k&":"&(i+3))
  21.         sleep(1000)
  22.     end
  23.    
  24. end
复制代码

调试结果:
11111.bmp

回复

使用道具 举报

发表于 2015-4-11 12:08:34 | 显示全部楼层
PGhuman 发表于 2015-4-11 12:03
把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for ...

   criticalenter(handle0)//进入临界区
   
    for(var i = 0; i < 3; i++)
        traceprint(“进入临界区”&k&":"&i)
        sleep(1000)
    end
    criticalleave(handle0)//离开临界区
    for(var i = 0; i < 3; i++)
        traceprint(“离开临界区”&k&":"&(i+3))
        sleep(1000)
    end
//这样你就很明显很看到了   
回复 支持 反对

使用道具 举报

发表于 2015-4-10 23:58:12 | 显示全部楼层
把删除临界区的代码注释起来
回复 支持 反对

使用道具 举报

发表于 2015-4-11 00:03:48 | 显示全部楼层
{:soso_e127:}   删除临界区,只有退出脚本或者不使用临界区了才进行删除。

你启动线程完后,就直接删除临界区了。你自己分析代码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-11 01:00:24 | 显示全部楼层
kevinqq 发表于 2015-4-10 23:58
把删除临界区的代码注释起来

1.我是按说明文件写的 11111.bmp
2.把删除临界区的代码注释掉,结果也一样。(刚试过)
回复 支持 反对

使用道具 举报

发表于 2015-4-11 09:38:22 | 显示全部楼层
临界区别用,用事件。
回复 支持 反对

使用道具 举报

发表于 2015-4-11 09:54:19 | 显示全部楼层
在把threadwaitfor(handlel[i],-1)  注释掉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-11 12:03:29 | 显示全部楼层
1106752189 发表于 2015-4-11 09:54
在把threadwaitfor(handlel,-1)  注释掉

把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for循环不代表线程会按照i的顺序到达调用的功能。。
回复 支持 反对

使用道具 举报

发表于 2015-4-11 12:07:19 | 显示全部楼层
PGhuman 发表于 2015-4-11 12:03
把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for ...

那是离开临界区后代码出现凌乱   在临界区里不会呀
回复 支持 反对

使用道具 举报

发表于 2015-4-11 12:11:26 | 显示全部楼层
PGhuman 发表于 2015-4-11 12:03
把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for ...

临界本来就会线程顺序乱 如果有2个以上同时进入  这样就会随机给一个  其它继续等待  
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-3 13:11 , Processed in 0.045269 second(s), 26 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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