0

我需要完全实现以下模式

R-------   ----     ----    ------
W       ----    -----    ----

如何使用 Monitor 实现这一点?下面的代码在某处包含错误,但我找不到它,我不熟悉多线程。

我需要像使用 fiber 一样的行为,但我无法更改运行时并且生产代码无法使用 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);
        }


    }
    }
4

0 回答 0