读书人

线程同步那点事。该如何解决

发布时间: 2013-03-19 17:22:05 作者: rapoo

线程同步那点事。
先看段简单代码

namespace ConsoleTest
{
public class Program
{
private static void Main()
{
var someClassObj = new SomeCalss();

// 锁定 someClassObj 对象
Monitor.Enter(someClassObj);

//线程池 开始一个工作项
ThreadPool.QueueUserWorkItem(o => Console.WriteLine(someClassObj.A));

Thread.Sleep(4000);
Console.WriteLine("主线程 Sleep 4s 结束了。");

//释放 someClassObj 对象
Monitor.Exit(someClassObj);

Console.ReadKey();
}
}

public class SomeCalss
{
public int A = 3;
}
}

结果输出如下:
3
主线程 Sleep 4s 结束了。

我的疑问是,主线程锁定 someClassObj 后,其他线程(这里是线程池的线程)不是就不能访问 someClassObj 对象的成员了吗?
为什么它会先打印出3,然后再打印 “主线程 Sleep 4s 结束了。”
我以为结果应该倒过来。


[解决办法]
主线程锁定 someClassObj 后,其他线程(这里是线程池的线程)不是就不能访问 someClassObj 对象的成员了吗?

谁告诉你的?

ThreadPool.QueueUserWorkItem(o => {lock(someClassObj) Console.WriteLine(someClassObj.A);});
[解决办法]

ThreadPool.QueueUserWorkItem(o =>
{ Monitor.Enter(someClassObj); ; Console.WriteLine(someClassObj.A); Monitor.Exit(someClassObj); });

这样才行。给分。
[解决办法]
LZ想当然了
http://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx
[解决办法]
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量
[解决办法]
引用:
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量

界面?临界区里的代码还说得过去

读书人网 >C#

热点推荐