В данном ниже коде на строчке "mutex2.ReleaseMutex();" происходит исключение "System.ApplicationException: "Для не синхронизированного блока кода вызван метод синхронизации объектов."
". Как это починить?

Код:
"using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MutexNumbers
{
    class Program
    {
        private const string File1 = "numbers.txt";
        private const string File2 = "primes.txt";
        private const string File3 = "primes_end7.txt";
        private const string ReportFile = "report.txt";

        private static Mutex mutex1 = new Mutex(true, "Mutex1");
        private static Mutex mutex2 = new Mutex(false, "Mutex2");
        private static Mutex mutex3 = new Mutex(false, "Mutex3");
        private static Mutex mutex4 = new Mutex(false, "Mutex4");

        static void Main(string[] args)
        {
            // Очистим файлы при старте
            if (File.Exists(File1)) File.Delete(File1);
            if (File.Exists(File2)) File.Delete(File2);
            if (File.Exists(File3)) File.Delete(File3);
            if (File.Exists(ReportFile)) File.Delete(ReportFile);

            Thread t1 = new Thread(Thread1_GenerateNumbers);
            Thread t2 = new Thread(Thread2_FilterPrimes);
            Thread t3 = new Thread(Thread3_FilterPrimesEnding7);
            Thread t4 = new Thread(Thread4_Report);

            t1.Start();
            t2.Start();
            t3.Start();
            t4.Start();

            mutex1.ReleaseMutex();

            t1.Join();
            t2.Join();
            t3.Join();
            t4.Join();

            Console.WriteLine("Все потоки завершили работу. Отчет создан: " + ReportFile);
        }

        static void Thread1_GenerateNumbers()
        {
            mutex1.WaitOne();

            Console.WriteLine("Поток 1: Генерация чисел в файл " + File1);

            Random rnd = new Random();
            int count = 100;
            using (var sw = new StreamWriter(File1))
            {
                for (int i = 0; i < count; i++)
                {
                    int n = rnd.Next(1, 100);
                    sw.WriteLine(n);
                }
            }

            Console.WriteLine("Поток 1: Запись завершена.");
            mutex2.ReleaseMutex();
        }

        static void Thread2_FilterPrimes()
        {
            mutex2.WaitOne();
            Console.WriteLine("Поток 2: Чтение " + File1 + " и фильтрация простых чисел в " + File2);

            var numbers = File.ReadAllLines(File1).Select(int.Parse);
            var primes = numbers.Where(IsPrime);

            File.WriteAllLines(File2, primes.Select(n => n.ToString()));

            Console.WriteLine("Поток 2: Запись простых чисел завершена.");
            mutex3.ReleaseMutex();
        }

        static void Thread3_FilterPrimesEnding7()
        {
            mutex3.WaitOne();

            Console.WriteLine("Поток 3: Фильтрация простых чисел, заканчивающихся на 7, в файл " + File3);

            var primes = File.ReadAllLines(File2).Select(int.Parse);
            var filtered = primes.Where(n => n % 10 == 7);

            File.WriteAllLines(File3, filtered.Select(n => n.ToString()));

            Console.WriteLine("Поток 3: Запись чисел, заканчивающихся на 7, завершена.");
            mutex4.ReleaseMutex();
        }

        static void Thread4_Report()
        {
            mutex4.WaitOne();

            Console.WriteLine("Поток 4: Создание отчета " + ReportFile);

            var sb = new StringBuilder();

            string[] files = { File1, File2, File3 };
            foreach (var file in files)
            {
                var lines = File.ReadAllLines(file);
                var length = new FileInfo(file).Length;
                sb.AppendLine($"Файл: {file}");
                sb.AppendLine($"Количество чисел: {lines.Length}");
                sb.AppendLine($"Размер файла (байт): {length}");
                sb.AppendLine("Содержимое:");
                sb.AppendLine(string.Join(", ", lines));
                sb.AppendLine(new string('-', 30));
            }

            File.WriteAllText(ReportFile, sb.ToString());

            Console.WriteLine("Поток 4: Отчет создан.");
        }

        static bool IsPrime(int number)
        {
            if (number <= 1) return false;
            if (number == 2) return true;
            if (number % 2 == 0) return false;

            int boundary = (int)Math.Sqrt(number);

            for (int i = 3; i <= boundary; i += 2)
            {
                if (number % i == 0)
                    return false;
            }
            return true;
        }
    }
}
"