Синхронизация потоков через Семафоры C#

367
02 июня 2017, 10:13

«Библиотека». Первый поток моделирует взятие книги читателем. Второй поток моделирует сдачу книги. Количество книг в библиотеке ограничено. Потоки находятся в разных процессах.

Подскажите, как должно быть? Делаю так:

 class Program
    {
        static Semaphore semaphoreObj = new Semaphore(4, 5, "my_semaphore");
        static void Main(string[] args)
        {  
            Process.Start(@"C:\visual studio 2015_Projects\4p\bin\Debug\4p.exe");
            Thread.Sleep(133);
            Thread.CurrentThread.Name = "Поток 1";
            while (true)
                Count();
            Console.ReadLine();
        }
        public static void Count()
        {
            for (int i = 0; i < 1000; i++)
            {
                semaphoreObj.WaitOne();
                int el;
                using (FileStream fsr = new FileStream(@"C:\books.txt", FileMode.Open))
                using (BinaryReader br = new BinaryReader(fsr)) el = br.ReadInt32();
                using (FileStream fsr1 = new FileStream(@"C:\books.txt", FileMode.Open))
                using (BinaryWriter bw = new BinaryWriter(fsr1))
                {
                    el -= 1;
                    bw.Write(el);
                }
                Thread.Sleep(1000);
                int f = semaphoreObj.Release();
                Console.WriteLine("{0} взял книгу. Книг {1}", Thread.CurrentThread.Name, f);
            }
        }
    }
}

И так:

    class Program
    {
        static Semaphore semaphoreObj;
        static void Main(string[] args)
        {
             semaphoreObj = Semaphore.OpenExisting("my_semaphore");
            Thread.CurrentThread.Name = "Поток 2";
           while (true)            
                Count();
              Console.ReadLine();
        }
        public static void Count()
        {
            for (int i = 0; i < 1000; i++)
            {
                semaphoreObj.WaitOne();
                int el;
                using (FileStream fsr = new FileStream(@"C:\books.txt", FileMode.Open))
                using (BinaryReader br = new BinaryReader(fsr)) el = br.ReadInt32();
                using (FileStream fsr1 = new FileStream(@"C:\books.txt", FileMode.Open))
                using (BinaryWriter bw = new BinaryWriter(fsr1))
                {
                    el += 1;
                    bw.Write(el);
                }
                Thread.Sleep(2500);
                int f=semaphoreObj.Release();
                Console.WriteLine("{0} сдал книгу. Книг {1}", Thread.CurrentThread.Name, f);
            }
        }
    }
}

Получается, что число книг не изменяется. В чем проблема не могу понять...

READ ALSO
Webbrowser c# Получить исходный код страницы после нажатия на кнопку

Webbrowser c# Получить исходный код страницы после нажатия на кнопку

Доброго времени суток, помогите решить проблему :

305
C# Canvas -&gt; Bitmap

C# Canvas -> Bitmap

У меня есть изображение в Canvas, мне надо его перевести в BitmapВезде написан один и тот же код, где при переводе используется PixelFormats

386
Как задать условие в C# для StreamReader

Как задать условие в C# для StreamReader

Делаю парсинг текстового файлаНужно задать условие: "если строка начинается с числа" и тд

266