次のパターンを正確に実装する必要があります
R------- ---- ---- ------
W ---- ----- ----
Monitor を使用してこれを実装する方法は? 以下のコードにはどこかにエラーが含まれていますが、マルチスレッドに慣れていないため、見つけることができません。
ファイバーのような動作が必要ですが、ランタイムを変更することはできず、生産コードはyield returnを使用できません(C# 1.0)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static object o = new object();
static void Main(string[] args)
{
Monitor.Enter(o); // make writer wait at start
ThreadPool.QueueUserWorkItem(x => {
WaitForStart();
Console.WriteLine("Entering");
Yield();
Console.WriteLine("yield 1");
Yield();
Console.WriteLine("yield 2");
Yield();
Console.WriteLine("yield 3");
Yield();
Console.WriteLine("Exiting");
});
Console.WriteLine("Finishing");
Start(); // start th writer
Console.WriteLine("get 1");
Get();
Console.WriteLine("get 2");
Get();
Console.WriteLine("get 3");
Get();
Console.WriteLine("Finishing");
Console.ReadLine();
}
private static void Get()
{
Monitor.Enter(o);
Monitor.Pulse(o);
Monitor.Exit(o);
}
private static void Yield()
{
Monitor.Pulse(o);
Monitor.Exit(o);
Monitor.Enter(o);
}
private static void WaitForStart()
{
Monitor.Enter(o);
}
private static void Start()
{
Monitor.Pulse(o);
Monitor.Exit(o);
}
}
}