工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2420|回复: 6

求好的线程互斥解决方案

[复制链接]
发表于 2007-4-20 10:53 | 显示全部楼层 |阅读模式
有两个对象,A,B
A有CallB函数,会调用B的test函数
B有CallA函数,会调用A的test函数
简单的说,有两个线程,分别会做这个事情
线程1调用A的CallB  A::CallB()->B::test   
线程2调用B的CallA  B::CallA()->A::test
如果CallA CallB内部都有一个临界区,进入函数就上锁。
以上程序有什么危险,能怎么解决
发表于 2007-4-20 19:43 | 显示全部楼层
:victory: 小康。。哈哈,王者归来啊。。
回复

使用道具 举报

发表于 2007-4-20 20:15 | 显示全部楼层
刚刚看到C++编程思想第二卷的线程部分...
回复

使用道具 举报

发表于 2007-4-20 20:18 | 显示全部楼层
http://gdutbbs.com/viewthread.ph ... hlight=%CF%DF%B3%CC

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

使用道具 举报

发表于 2007-4-21 09:43 | 显示全部楼层
java线程互锁的问题我也没办法解决。。
回复

使用道具 举报

发表于 2007-4-22 16:16 | 显示全部楼层
JDK5.0可以用Lock实现
回复

使用道具 举报

发表于 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 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-17 06:58

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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