关于lock的问题~

zfviwx 2008-07-02 06:58:00
如果线程1正在运行lock(obj){}内的代码,这时候线程2调用一个obj的方法,线程2会被sleep么?还是说如果想在此时令线程2sleep,必须要为线程2调用的obj的方法加上lock?
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbbbbb888888 2008-07-07
  • 打赏
  • 举报
回复
学习....
lextm 2008-07-07
  • 打赏
  • 举报
回复
采用一个ManualResetEvent对象A。

每个操作之前都做A.WaitOne,如果返回false,说明别的地方在使用A,函数返回。

如果返回是true,那么执行A.Set,随后开始操作你的obj。操作完之后记得要A.Reset。

请格外注意你的操作可能会引发异常,那么要用try finally保证Reset发生。而A的作用域最好和obj一致,这样可以保证A可以随时保护obj。
zfviwx 2008-07-07
  • 打赏
  • 举报
回复
谢谢楼上大侠们的回复~顶楼的问题已经解释的很清楚了~~

现在的问题是:如果线程1正在运行任意obj的方法(如obj.a()),那么任何其他线程都禁止访问obj的任何方法,怎么做呢?我能想到的就是在每一个方法开始和结束的时候加个bool的变量判断,如:

bool objFree = true;
void a()
{
while (!objFree)
{
Thread.Sleep(100);
}
objFree = false;

/******* Do something *******/

objFree = true;
}

将所有obj类的方法都写成上述格式,请问还有更好的办法么?
DalyQiao 2008-07-03
  • 打赏
  • 举报
回复
不会,必须lock(obj),所有引用obj的地方都必须lock(obj)才可以串行化访问
lhsxsh 2008-07-03
  • 打赏
  • 举报
回复
mark
heguo 2008-07-02
  • 打赏
  • 举报
回复
我认为应该这样理解的:

obj在lock时,应该抽象为“互斥对象”,“临界资源”,等同于一把锁,一扇门。

lock(obj) //在这里把门给锁上了
{
..... //只有进门的线程可以执行这些代码,门外的线程必须等候
}
..... //在这里门开了,可以放进另一个等候的线程进来执行。




所以,通常
object objSync = new object(); //声明这把锁,而不关心objSync是属于哪个类的,有哪些方法。
fuadam 2008-07-02
  • 打赏
  • 举报
回复
lock(obj)
{
obj.a();
}
zfviwx 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jzywh 的回复:]
lock(obj){}

是保证在同一时间内只有一个线程在此范围内运行


这时候线程2调用一个obj的方法,线程2会被sleep么?
--------------------------------------------------
不是,这个和obj的方法无关


还是说如果想在此时令线程2 sleep,必须要为线程2调用的obj的方法加上lock
--------------------------------------------------
理解错误

如果有一线程在lock范围内执行,那么另一线程只有等第一个线程…
[/Quote]


也就是说即使为线程2调用的obj的方法(如obj.a())上lock(obj)也不能起到sleep的作用了?

那如果我想实现:
只要线程1正在运行lock(obj){}的代码时,线程2调用obj.a()就sleep,直到线程1释放obj。
要如何做呢?
jzywh 2008-07-02
  • 打赏
  • 举报
回复
lock(obj){}

是保证在同一时间内只有一个线程在此范围内运行


这时候线程2调用一个obj的方法,线程2会被sleep么?
--------------------------------------------------
不是,这个和obj的方法无关


还是说如果想在此时令线程2 sleep,必须要为线程2调用的obj的方法加上lock
--------------------------------------------------
理解错误

如果有一线程在lock范围内执行,那么另一线程只有等第一个线程从lock返回内出来才可以执行lock内的程序
otie 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 asdf311 的回复:]
貌似是滴~

mark下~
[/Quote]
wheeler 2008-07-02
  • 打赏
  • 举报
回复
貌似是滴~

mark下~

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧