TC官方合作论坛

标题: TC5-4.3线程临界区问题 [打印本页]

作者: PGhuman    时间: 2015-4-10 22:10
标题: TC5-4.3线程临界区问题
本帖最后由 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
复制代码

调试结果:



作者: kevinqq    时间: 2015-4-10 23:58
把删除临界区的代码注释起来
作者: zxw445    时间: 2015-4-11 00:03
   删除临界区,只有退出脚本或者不使用临界区了才进行删除。

你启动线程完后,就直接删除临界区了。你自己分析代码。
作者: PGhuman    时间: 2015-4-11 01:00
kevinqq 发表于 2015-4-10 23:58
把删除临界区的代码注释起来

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

作者: tempbb1234    时间: 2015-4-11 09:38
临界区别用,用事件。
作者: 1106752189    时间: 2015-4-11 09:54
在把threadwaitfor(handlel[i],-1)  注释掉
作者: PGhuman    时间: 2015-4-11 12:03
1106752189 发表于 2015-4-11 09:54
在把threadwaitfor(handlel,-1)  注释掉

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

作者: 1106752189    时间: 2015-4-11 12:07
PGhuman 发表于 2015-4-11 12:03
把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for ...

那是离开临界区后代码出现凌乱   在临界区里不会呀
作者: 1106752189    时间: 2015-4-11 12:08
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
//这样你就很明显很看到了   

作者: 1106752189    时间: 2015-4-11 12:11
PGhuman 发表于 2015-4-11 12:03
把threadwaitfor(handlel,-1)  注释掉后有效果,但是线程的顺序会乱,
可能先运行i=2,也可能是i=1,for ...

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




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1