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