singrdk/base/Applications/Tests/Scheduler/Threading/TestSynchronize.cs

127 lines
3.7 KiB
C#
Raw Normal View History

2008-11-17 18:29:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
using System;
using System.Threading;
using Microsoft.Singularity.UnitTest;
namespace Microsoft.Singularity.Applications
{
internal sealed class TestSynchronize
{
private static Mutex! mutex;
private static AutoResetEvent! autoResetEvent;
private static ManualResetEvent! manualResetEvent;
private static AutoResetEvent! syncEvent;
private static Mutex! consoleLock;
private static void SyncThread()
{
Write("[2] Acquiring mutex...");
mutex.WaitOne();
Write("[2] Mutex acquired!");
mutex.ReleaseMutex();
Write("[2] Mutex released.");
Thread.Yield();
Thread.Yield();
Thread.Yield();
Thread.Yield();
Thread.Yield();
Write("[2] Setting event.");
autoResetEvent.Set();
Thread.Yield();
Thread.Yield();
Thread.Yield();
Thread.Yield();
Thread.Yield();
Write("[2] Waiting for notification...");
syncEvent.WaitOne();
Write("[2] Setting event.");
autoResetEvent.Set();
Write("[2] Waiting for notification...");
syncEvent.WaitOne();
Write("[2] Setting manual event.");
manualResetEvent.Set();
}
internal static void Run()
{
mutex = new Mutex();
autoResetEvent = new AutoResetEvent(false);
manualResetEvent = new ManualResetEvent(true);
syncEvent = new AutoResetEvent(false);
consoleLock = new Mutex();
Thread t1 = new Thread(new ThreadStart(SyncThread));
t1.Start();
Write("[1] Acquiring mutex...");
mutex.WaitOne();
Write("[1] Mutex acquired!");
Write("[1] Releasing mutex...");
mutex.ReleaseMutex();
Write("[1] Mutex released.");
Write("[1] Acquiring mutex...");
mutex.WaitOne();
Write("[1] Mutex acquired!");
Write("[1] Yielding (1/3).");
Thread.Yield();
Write("[1] Yielding (2/3).");
Thread.Yield();
Write("[1] Yielding (3/3).");
Thread.Yield();
Write("[1] Releasing mutex...");
mutex.ReleaseMutex();
Write("[1] Mutex released.");
Write("[1] Waiting on event.");
autoResetEvent.WaitOne();
Write("[1] Event set!");
Write("[1] Setting sync event.");
syncEvent.Set();
Write("[1] Waiting on event.");
autoResetEvent.WaitOne();
Write("[1] Event set!");
Write("[1] Waiting on manual event.");
manualResetEvent.WaitOne();
Write("[1] Event set!");
Write("[1] Resetting manual event.");
manualResetEvent.Reset();
Write("[1] Setting sync event.");
syncEvent.Set();
Write("[1] Waiting on manual event.");
manualResetEvent.WaitOne();
Write("[1] Event set!");
Write("[1] Waiting on manual event.");
manualResetEvent.WaitOne();
Write("[1] Event set!");
}
private static void Write(string text)
{
consoleLock.WaitOne();
Console.Write(" " + text);
consoleLock.ReleaseMutex();
}
}
}