TC官方合作论坛

标题: 关于临界区的一点疑问 求解决 只是理解层面的! [打印本页]

作者: xenolss    时间: 2012-5-20 22:37
标题: 关于临界区的一点疑问 求解决 只是理解层面的!
全局 int x

function bool A()
while(true)
hwndlj=thread.createcritical()
thread.thread.entercritical(hwndlj)
x=0
thread.leavecritical(hwndlj)
thread.deletecritical(hwndlj)
endwhile
return true
endfunction

function bool B()
while(true)
x=1
endwhile
return true
endfunction

function bool C()
thread.beginthread("空间.A","")
空间.B()
return true
endfunction
上面是2个死循环

我想问的是  当线程执行A进入临界区赋值全局x=0的时候 未离开临界区之前
B功能能否进入全局x 的地址对x 改变赋值
我的理解是不能
不知道对不对
请大神不吝赐教!

作者: xenolss    时间: 2012-5-20 22:40
我对线程执行临界区里的东西做了个实验
发现只要不动全局共享资源
线程1 进入的函数开启临界区 所做功能操作 未离开临界区之前
线程2 也会立即执行
加入延迟也是如此
但是如果在该函数里加上一个改变全局变量的操作  延迟就生效了
线程2会等待线程1执行这个延迟并改变全局变量退出临界区之后 才操作


但是上面的功能B 是主程序执行的  不是单du开的线程 我不确定是不是也会和开2个线程一样的结果

作者: xenolss    时间: 2012-5-20 23:03
求解释。。。。。。在线等
作者: 超自然    时间: 2012-5-21 01:25
你代码写错了,不是这么玩的
走C,开出线程走A,去创建临界并赋值x,此时调用B,
A虽然在临界里,但是B去操作x因为没进临界所以临界里的事跟他没什么关系,照样可以操作
全局  int hwndlj,x
function bool A()
int i
while(true)
hwndlj=thread.createcritical()
thread.thread.entercritical(hwndlj)
while (i<100)
x=0
i=i+1
等待100毫秒
endwhile           //这循环是为了让你看清楚,暂时困住线程
thread.leavecritical(hwndlj)
thread.deletecritical(hwndlj)      //注意这里不能出去了就删,因为后面有个线程要进来,会崩的
endwhile
return true
endfunction

function bool B()
thread.deletecritical(hwndlj)
while(true)
if (x==1)
消息框
else
x=1
endif
endwhile
return true
endfunction

照这样试试吧,i=100之后,x才会被改成1
作者: xenolss    时间: 2012-5-21 01:52
回复 4楼超自然的帖子

明白了 谢谢自然大神的指点
这么写调试的时候就看的很清楚了!
作者: xenolss    时间: 2012-5-21 01:55
回复 4楼超自然的帖子

大神 我还有个疑问
如果 A走了不能立刻删除临界 因为别的线程要进入 会崩
那么  如果有个功能我要长期 对全局进行操作 线程都是排队进入的
是不是不删除临界比较好?如果一直不删会不会有什么影响
作者: tyuyan    时间: 2012-5-21 09:14
好吧!进来酱油下
作者: 花开花落    时间: 2012-5-21 10:08
来看看 。  学习下。
作者: 战斗之神    时间: 2012-5-21 11:25
看看   学习了。
作者: 超自然    时间: 2012-5-21 18:26
回复 6楼xenolss的帖子

我从来没删过,都是全程存在的,好像也没什么不可以

作者: xenolss    时间: 2012-5-21 20:14
回复 10楼超自然的帖子

那我就放心了 我也全程开着 不管他




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