线程的LOCK使用问题

blueinbest 2011-01-04 02:42:46
例如我有一个全局变量(用静态类来做)Class.num,还有一个Class.obj,用来lock用

分别有Thread_A和Thread_B两个线程同时工作

现在这两个线程都有可能同时去访问修改这个Class.num

我想用lock去保护,达到让这两个线程顺序的去访问修改这个Class.num

那么看书上写的应该是:

lock(Class.obj)
{
Class.num=123;//这样去保护就没事了
}


问题来了

假如我有三个要保护的变量呢,如再加一个Class.code

如果我继续用lock来保护
lock(Class.obj)
{
Class.code=333;
}

那么,在Thread_A执行到
lock(Class.obj)
{
Class.code=333;
}
的时候,另一个线程Thread_B在执行
lock(Class.obj)
{
Class.num=123;
}
这句时,会等待Thread_A的lock执行完再执行吗?


具体就是想弄明白,lock是对Class.obj来进行保护还是对lock的语句块里的变量进行保护
...全文
53 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
blueinbest 2011-01-04
  • 打赏
  • 举报
回复
搞懂了,结贴了
blueinbest 2011-01-04
  • 打赏
  • 举报
回复
是用

System.Threading.Monitor.Enter(Class.obj)
try
{
//...
}
finally
{
System.Threading.Monitor.Exit(Class.obj)
}

这个语句的效果等同于上面说的delphi的效果吗?
blueinbest 2011-01-04
  • 打赏
  • 举报
回复
c#里有什么方案可以和delphi的临界区一样使用

MyCsVal: TRTLCriticalSection; //临界区变量

EnterCriticalSection(MyCsVal);
try
.....
finally
LeaveCriticalSection(MyCsVal);
end;

这个是保护块里变量的,而不是针对MyCsVal的
sprc_lcl 2011-01-04
  • 打赏
  • 举报
回复
lock是对Class.obj来进行保护
blueinbest 2011-01-04
  • 打赏
  • 举报
回复
Thread_A会等Thread_B执行完再执行吗?还是同时执行?
雨师88 2011-01-04
  • 打赏
  • 举报
回复
对象~、变量都会、不过一般是长度加大的变量才需要lock

110,499

社区成员

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

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

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