Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            var random = new Random();
            MonitorConfiguration config  = ConfigurationReader.Read(GetConfigPath());
            MonitorWrapper       wrapper = MonitorWrapper.Instance;

            wrapper.ApplyConfig(config);
            wrapper.Start();
            DistributedMonitor monitor = wrapper.CreateMonitorIfNotExists(1);

            // Przygotowanie zmiennej warunkowej
            monitor.Acquire();
            var cv = monitor.CreateConditionalVariableIfNotExists(1);

            if (cv.Value == null)
            {
                cv.Value = 0;
            }
            monitor.Release();

            if (wrapper.ID == 0 || wrapper.ID == 1 || wrapper.ID == 2)
            {
                while (true)
                {
                    //READERS
                    monitor.Acquire();
                    while (((int)cv.Value) < 0)
                    {
                        Console.WriteLine($"Wait {wrapper.ID} - pisarz w środku");
                        cv.Wait();
                    }
                    cv.Value = (int)cv.Value + 1;
                    monitor.Release();

                    Console.WriteLine($"Czytam {wrapper.ID}");
                    Thread.Sleep(random.Next(1000, 3000));
                    Console.WriteLine($"Skończyłem {wrapper.ID}");

                    monitor.Acquire();
                    cv.Value = (int)cv.Value - 1;
                    if ((int)cv.Value == 0)
                    {
                        cv.SignalAll();
                    }
                    monitor.Release();

                    Console.WriteLine($"Wyszedłem i czekam {wrapper.ID}");
                    Thread.Sleep(random.Next(3000, 5000));
                }
            }
            else
            {
                //WRITERS
                while (true)
                {
                    monitor.Acquire();
                    while (((int)cv.Value) != 0)
                    {
                        Console.WriteLine($"Wait {wrapper.ID} - ktoś w środku");
                        cv.Wait();
                    }
                    cv.Value = -1;
                    monitor.Release();

                    Console.WriteLine($"Piszę {wrapper.ID}");
                    Thread.Sleep(random.Next(1000, 3000));
                    Console.WriteLine($"Skończyłem {wrapper.ID}");

                    monitor.Acquire();
                    cv.Value = 0;
                    cv.SignalAll();
                    monitor.Release();

                    Console.WriteLine($"Wyszedłem i czekam {wrapper.ID}");
                    Thread.Sleep(random.Next(3000, 5000));
                }
            }
        }
 public FileSystemEnumerate()
 {
     _directoryTree = new List<PropertyInfo>();
     _monitor = new MonitorWrapper(ref _lock);
 }