Найти ошибки в многопоточном приложении - C#

Узнай цену своей работы

Формулировка задачи:

1 поток- нахождение среднекв.отклонения каждых 1000 элементов 2 поток- сумма каждых ста элементов помогите разобраться, что начудила и почему не работает =(
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; // Поддержка многопоточности
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread myThread = new Thread(Function); // Создаем новый объект потока (Thread)
 
            myThread.Start();  // запускаем поток
        }

        public class Processor
        {
            private double[] Massiv1;
            private int count_str = 0;
            private int count_i = 0;
            private double rezult = 0;
            private double tmp_w = 0;
            private bool flag = false;
            public List<double> list_result;
            public List<double> list_result2;
            object locker = new object();
            private double sum2;
 
            public Processor()
            {
                this.writeFile();
                this.Massiv1 = new double[1000];
                list_result = new List<double>();
            }
 
            private void writeFile()
            {
                Random rnd = new Random();
                System.IO.StreamWriter sw = new System.IO.StreamWriter("First_set.txt");
                for (int i = 0; i < 10000; i++)
                {
                    sw.WriteLine(rnd.Next(1000) + rnd.NextDouble());
                }
                sw.Close();
                Console.WriteLine("Создание файла и запись 10000 строк в него выполнено! \n");
            }
 
            private double[] readFile()
            {
                int i = 0;
 
                StreamReader sr = new StreamReader("First_set.txt");
                for (int j = 0; j < count_i + 1000; j++)
                {
                    if (j == this.count_str)
                    {
                        this.Massiv1[i] = Convert.ToDouble(sr.ReadLine());
                        i++;
                        this.count_str++;
                    }
                    else
                    {
                        this.tmp_w = Convert.ToDouble(sr.ReadLine());
                    }
                }
                sr.Close();
 
                Console.WriteLine("Чтение из файла строк с " + this.count_i + " по " + this.count_str + " выполнено!");
 
                this.count_i = this.count_str;
 
                return this.Massiv1;
            }
 
            public double Calculation(double[] Massiv1)
            {
                double sum = 0;
                double sArifm = 0;
                double disp = 0;
                double sko = 0;
 
                for (int i = 0; i < 1000; i++)
                    sum = sum + this.Massiv1[i];       // сумма всех элементов в строке
 
                sArifm = sum / 10000;       // среднее арифметическое чисел строки
 
                for (int i = 0; i < 1000; i++)
                    disp = sum + Math.Pow(this.Massiv1[i] - sArifm, 2); // дисперсия
 
                sko = Math.Sqrt(sum / 1000);      // среднее квадратичное отклонение
                return sko;
            }

            private void fun()
            {
                this.rezult = this.rezult / 100;
                this.list_result.Add(this.rezult);
                System.IO.StreamWriter swr = new System.IO.StreamWriter("Second_set.txt");
                for (int i = 0; i < this.list_result.Count; i++)
                    swr.WriteLine(this.list_result[i]);
                swr.Close();
 
                Console.WriteLine("Запись " + this.count_str / 1000 + " результата в файл выполнено! \n");
            }
 
            private static void Function()
            {
                Processor p = new Processor();
                {
                    p.readFile2();
                    p.list_result = new List<double>();
                }
 
            }
 
            private double[] readFile2()
            {
                int i = 0;
 
                StreamReader sr = new StreamReader("Second_set.txt");
                for (int j = 0; j < count_i + 10; j++)
                {
                    if (j == this.count_str)
                    {
                        this.Massiv1[i] = Convert.ToDouble(sr.ReadLine());
                        i++;
                        this.count_str++;
                    }
                    else
                    {
                        this.tmp_w = Convert.ToDouble(sr.ReadLine());
                    }
                }
                sr.Close();
 
                Console.WriteLine("Чтение из файла строк с " + this.count_i + " по " + this.count_str + " выполнено!");
 
                this.count_i = this.count_str;
 
                return this.Massiv1;
            }

            public double Calculation_2(double[] Massiv1)
            {
                double sum2 = 0;
                for (int i = 0; i < 100; i++)
                    sum2 = sum2 + this.Massiv1[i];
                return sum2;
            }
            private void fun_2()
            {
                list_result2.Add(sum2);
                StreamWriter swr = new StreamWriter("Third_set.txt");
                for (int i = 0; i < list_result2.Count; i++)
                    swr.WriteLine(list_result2[i]);
                swr.Close();
 
                Console.WriteLine("Запись " + this.count_str / 1000 + " результата в файл выполнено! \n");
            }

            private void getResult()
            {
                while (this.count_str < 10000)
                {
                    lock (locker)
                    {
                        if (!this.flag)
                        {
                            Console.WriteLine("Работает поток " + Thread.CurrentThread.Name);
                            this.rezult = this.Calculation(this.readFile());
                            this.flag = true;
                        }
                        else
                        {
                            Console.WriteLine("Работает поток " + Thread.CurrentThread.Name);
                            this.fun();
                            this.flag = false;
                        }
                    }
                }
            }}}}

Решение задачи: «Найти ошибки в многопоточном приложении»

textual
Листинг программы
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; // Поддержка многопоточности
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Processor p = new Processor();
            Thread t1 = new Thread(p.Average100) { Name = "Средние значения" };
            Thread t2 = new Thread(p.Deviation1000) { Name = "Отклонения" };
            t1.Start();
            t2.Start();
            t1.Join();
            t2.Join();
            Console.WriteLine("Готово");
            Console.ReadKey();
        }
    }
 
    public class Processor
    {
        private static Random rnd = new Random();
        private double[] data;
        private object locker;
        public Processor()
        {
            locker = new object();
            data = ReadFile();
            CreateFile();
        }
 
        private void CreateFile()
        {
            using (StreamWriter sw = new StreamWriter("First_set.txt", false))
            {
                for (int i = 0; i < 10000; i++)
                {
                    sw.WriteLine(rnd.Next(1000) + rnd.NextDouble());
                }
            }
        }
 
        private double[] ReadFile()
        {
            List<double> values = new List<double>();
            using (StreamReader sr = new StreamReader("First_set.txt"))
            {
                while (!sr.EndOfStream)
                {
                    values.Add(double.Parse(sr.ReadLine()));
                }
            }
            return values.ToArray();
        }
 
        private double StandartDeviation(double[] array)
        {
            double average = Average(array);
            double disp = 0;
            for (int i = 0; i < array.Length; i++)
            {
                disp += (array[i] - average) * (array[i] - average);
            }
            return Math.Sqrt(disp / array.Length);
        }
 
        private double Average(double[] array)
        {
            double sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            return sum / array.Length;
        }
 
        public void Average100()
        {
            int size;
            lock (locker)
                size = data.Length;
            for (int i = 0; i < size / 100 - 1; i++)
            {
                lock (locker)
                {
                    double[] toCalc = new double[100];
                    Array.Copy(data, i * 100, toCalc, 0, 100);
                    double av = Average(toCalc);
                    Console.WriteLine("Поток {0}: ({1}-{2}), результат {3}", Thread.CurrentThread.Name, i * 100, (i + 1) * 100, av);
                }
            }
        }
 
        public void Deviation1000()
        {
            int size;
            lock (locker)
                size = data.Length;
            for (int i = 0; i < size / 1000 - 1; i++)
            {
                lock (locker)
                {
                    double[] toCalc = new double[1000];
                    Array.Copy(data, i * 1000, toCalc, 0, 1000);
                    double dev = StandartDeviation(toCalc);
                    Console.WriteLine("Поток {0}: ({1}-{2}), результат {3}", Thread.CurrentThread.Name, i * 1000, (i + 1) * 1000, dev);
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.714 из 5