返回首页

{A}简介
随着Windows Vista的发布,微软推出了一个新的同步原语所谓的quot;条件Vari​​ablequot。在这篇文章中,我将解释(严重)条件变量的功能,也提供了。NET包装。背景
线程同步可以是一个复杂的,有时令人沮丧的任务。我拥抱带来任何使任务更容易一些。微软也只是说,他们推出的条件变量。当我看到它,我说,quot;真棒!不能等待使用它quot!;不幸的是,功能只接触到非托管世界,和我在C#店工作。那么,什么是一个男人做呢?嗯....利用C / CLI编写一个包装,揭露功能。NET世界,并写了一篇文章,当然!条件变量的说明
那么,什么是条件变量了吗?条件变量允许一个线程释放锁(CRITICAL_SECTION),并进入等待状态,在单个原子操作。一旦线程被唤醒时,它会立即要求以前发布的锁。通过CONDITION_VARIABLE和相关的Win32 API函数控制线程醒来。一个更好的解释和Win32 API函数的列表,请参阅{A2}。使用代码
你会注意到的第一件事是,C项目包含不是一个,而是两个班。由于微软并没有揭露";关键Sectionquo​​t;功能(他们这样做,但是,通过System.Threading.Monitor方法提供类似的功能),我也不得不写一个关键部分的包装,因为条件变量需要他们。
你会注意到,我命名为包装类的quot;条件Vari​​ablequot功能,"WaitConditionquo​​t;,它只是似乎更好,以适应使用模式。无论如何,你的代码,并可以将其命名为任何你喜欢的。下面,你会发现使用的类(我已经包含了一个示例应用程序的quot端口;使用条件Vari​​ablesquot;节的Vista / Server 2008的SDK)的基本格局:

 WaitCondition waitCondition = new WaitCondition();

 CriticalSection criticalSection = new CriticalSection(); 

 //Thread 1:

 criticalSection.Enter();

 //in a single atomic operation, release the critical section 

 //and sleep (waiting for the condition variable to be signaled

 waitCondition.Sleep(criticalSection);

 //Thread 2: wake up Thread 1

 waitCondition.WakeOne();

 //Thread 1:  Once awake, do something....

 DoSomething();

 //Exit the Critical Section

 criticalSection.Exit();

 //Don't forget to dispose, or leverage the 'using' statement

 //to ensure that the unmanaged CRITICAL_SECTION and

 //CONDITION_VARIABLE structures are properly released

 waitCondition.Dispose();

 criticalSection.Dispose();
兴趣点
虽然在技术上是没关系。NET System.Threading.Monitor类的地方使用CriticalSection类,反对,我会建议。我测试这对Monitor类的类,它的速度慢60%左右。不幸的是,没有办法利用的条件变量Monitor类。

回答

评论会员:A 时间:2