首页 新闻 会员 周边 捐助

能否让线程遇上阻塞就终止,而不是等待?

0
[待解决问题]

使用lock语句、AutoResetEvent/ManualResetEvent的Reset、用[MethodImpl(MethodImplOptions.Synchronized)]标记方法等等方式,都可以阻塞线程,为了说清这个问题,我先定义两个概念:

1、希望资源不被争用的人,我称为资源【提供者】

2、访问资源的人,称为【访问者】

所以这个问题我想从两者的角度得到答案:

- 从提供者的角度,能否/如何做到让后来的线程退散,别候着了

- 从访问者的角度,能否/如何做到默默离开,不凑热闹

求解答,谢谢。

ahdung的主页 ahdung | 菜鸟二级 | 园豆:206
提问于:2016-09-20 12:31
< >
分享
所有回答(2)
0

你这些WaitHandle看看里面是不是有很多waitone的重载,是不是有些带类似超时的的东西?

另一种方案,你直接用cas的Interlocked的CompairExchange也可以做到这个功能。

Daniel Cai | 园豆:10424 (专家六级) | 2016-09-20 12:43

谢谢支招,让Wait超时是访问者的手法,我其实更关心从提供者角度出发的办法。另外请问cas是什么?

支持(0) 反对(0) ahdung | 园豆:206 (菜鸟二级) | 2016-09-20 13:04

@ahdung: compare and swap,一个原子性的操作。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-20 13:12

@Daniel Cai: 哦我以为是什么第三方类库,您是指.net自带Interlocked类是吧。但这个弯我没转过来,CompairExchange如何能达到目的?有妙用?

支持(0) 反对(0) ahdung | 园豆:206 (菜鸟二级) | 2016-09-20 13:17

@ahdung: CompairExchange

传入3个参数,一个是目标,一个是期望换的值,一个是与目标相比的值

如果目标与比较值相同则进行更换且返回目标更换之前的值。

你在你所谓的提供者这块就可以使用这个做限制了。

int status=0;

....

bool TryGetResource(...out Resource res)

{

Resource res=null;

  if(Interlocked.CompairExchange(ref status,1,0)==0)

 {

//someone got the resource

  res=....;

  return true;

 }

//in case when no resouces is available

 return false;

}

 

void ReturnResource(Resource res)

{

 //return your resource

 ...

 Interlocked.Exchange(ref status,0);

}

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-20 14:12

@Daniel Cai: 感谢耐心指教,我参悟一下先

支持(0) 反对(0) ahdung | 园豆:206 (菜鸟二级) | 2016-09-20 14:14
0

我们项目中两处跳过锁的代码。希望对你有帮助。

我叫So | 园豆:186 (初学一级) | 2016-09-20 13:31

感谢无私分享!原来Interlocked真有妙用,学习了。不过我仍然想知道在提供者的角度能不能喊人家不要等。

支持(0) 反对(0) ahdung | 园豆:206 (菜鸟二级) | 2016-09-20 13:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册