当前位置: 代码迷 >> 多核软件开发 >> 关于线程同步的有关问题~
  详细解决方案

关于线程同步的有关问题~

热度:8082   发布时间:2013-02-26 00:00:00.0
关于线程同步的问题~~~
C# code
                    //线程1 负责 enqueue                     lock (_queProduction)                    {                       _queProduction.Enqueue(dt);                    }                    //线程2 负责将_queProduction对象截断并赋值给queue,然后重新实例化_queProduction                    Queue<DataTable> queue = null;                lock (_queProduction)                    {                        queue = _queProduction;                        _queProduction = new Queue<DataTable>();                    }

描述 :要实现线程2 _queProduction 实例化新对象时,线程1 不 enqueue 
怎么写~~~

------解决方案--------------------------------------------------------
用Monitor吧,或者用api的事件,c#也有封装
------解决方案--------------------------------------------------------
.NET 4.0为多线程提供了一些安全的泛型,在System.Collections.Concurrent命名空间里。
其中提供有ConcurrentQueue<T>泛型类,还有BlockingCollection<T>等,应该可以实现你的要求。

链接如下:http://msdn.microsoft.com/zh-cn/library/dd997305.aspx
------解决方案--------------------------------------------------------
既然_queProduction被改变,就不应该直接lock(_queProduction)

应该lock另一个专门的锁,

object rLockqueProduction=new object();

//线程1 负责 enqueue
lock (rLockqueProduction)
{
_queProduction.Enqueue(dt);
}

//线程2 负责将_queProduction对象截断并赋值给queue,然后重新实例化_queProduction
Queue<DataTable> queue = null;
lock (rLockqueProduction)
{
queue = _queProduction;
_queProduction = new Queue<DataTable>();
}


这样就行了,
  相关解决方案