首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2012-03-27 
关于线程同步的问题~~~C# code//线程1 负责 enqueuelock (_queProduction){_queProduction.Enqueue(dt)}/

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

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>();
}


这样就行了,

热点排行