首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-03-19 
线程同步那点事。先看段简单代码namespace ConsoleTest{public class Program{private static void Main(){

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

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
[解决办法]
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量
[解决办法]
引用:
锁定只是锁定了界面更新,并不是不能访问和调用主线程的方法、变量

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

热点排行