小康 发表于 2007-4-20 10:53

求好的线程互斥解决方案

有两个对象,A,B
A有CallB函数,会调用B的test函数
B有CallA函数,会调用A的test函数
简单的说,有两个线程,分别会做这个事情
线程1调用A的CallBA::CallB()->B::test   
线程2调用B的CallAB::CallA()->A::test
如果CallA CallB内部都有一个临界区,进入函数就上锁。
以上程序有什么危险,能怎么解决

brilon 发表于 2007-4-20 19:43

:victory: 小康。。哈哈,王者归来啊。。

iptton 发表于 2007-4-20 20:15

刚刚看到C++编程思想第二卷的线程部分...

iptton 发表于 2007-4-20 20:18

http://gdutbbs.com/viewthread.php?tid=69117&highlight=%CF%DF%B3%CC

搜了下线程 。。。只有四帖....

brilon 发表于 2007-4-21 09:43

java线程互锁的问题我也没办法解决。。

xinggg22 发表于 2007-4-22 16:16

JDK5.0可以用Lock实现

yonhe 发表于 2007-4-30 16:34

不知这样行不?

首先将函数调用理解为“请求”。
   A.callB和B.callA很可能同时请求对方的test函数,而此时各自的test函数已经上锁。这样的话,A.callB和B.callA就会出现“请求环"。
在保护原有请求需求的条件下,解决方法就是要去除任何时刻的请求环,只要将相互的请求安排在不同时间就可以。
可以增加一个控制变量(临界变量)来控制请求的顺序。比如:增加一个A和B都可以访问的临界变量c,
1,c初始为false
2,仅当c==false时,才可以进入B.callA的A.test 或进入A.callB的B.test,
3,一旦进入B.callA的A.test 或进入A.callB的B.test,就令c=true,离开时令c=false

这样就可以避免B.callA请求A.test时A.callB也在请求B.test所造成的死锁

[ 本帖最后由 yonhe 于 2007-4-30 16:37 编辑 ]
页: [1]
查看完整版本: 求好的线程互斥解决方案