Чтение текстового файла с использованием распараллеливания потоков - PullRequest
0 голосов
/ 28 октября 2019

Я хочу прочитать текстовый файл, используя потоки, которые должны работать параллельно. Я знаю кое-что о том, как создавать потоки и синхронизацию (используя Interlock и Lock), но я не могу прочитать файл, используя потоки параллельно. Проблема в том, что мне нужно прочитать 4 строки, используя 4 потока, каждый из которых читает разные строки одновременно. Например;

Резьба 1 --- Строка 1;

Резьба 2 --- Строка 2;

Резьба 3 --- Строка 3;

Резьба 4 --- строка 4;

резьба 1 --- строка 5;

резьба 2 --- строка 6;и так далее ...

Текстовый файл содержит только положительные целые числа, то есть каждая строка имеет 1 положительное целое число. И домашнее задание хочет, чтобы я прочитал все строки, сделал некоторые математические расчеты с числами и вычислил общее время, необходимое для этого. Затем мне нужно показать, что время параллелизации меньше обычного последовательного чтения (без потоков).

Я попытался выполнить некоторую синхронизацию, но он позволяет только одному потоку читать строку одновременно идругие 3 ждут, я думаю. И результат был уже хуже последовательного.

Итак, что я делаю не так? Нужно ли изучать другую главу? Если да, может ли кто-нибудь предоставить мне материал для этого?

Вот пример кода;

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace Assignment_2
{
    class Program
    {
        private int line_counter = 2;
        private string path = "C:\\Users\\Asus\\Desktop\\AdvProgTec1\\ws19\\Assignment_2\\Assignment_2\\TOSUM1.DAT";
        private int count = 0; // number of even integers in the list
        private double sum = 0; // sum of those even integers
        private double temp_number;
        private int total_number_of_lines;


        public void Process(object state)
        {
            //string path = "C:\\Users\\Asus\\Desktop\\AdvProgTec1\\ws19\\Assignment_2\\Assignment_2\\TOSUM1.DAT";
            //int count = 0; // number of even integers in the list
            //double sum = 0; // sum of those even integers
            //double temp_number;
            //int total_number_of_lines;

            try
            {
                using (StreamReader sr = new StreamReader(path))
                {
                    total_number_of_lines = Convert.ToInt32(sr.ReadLine());
                    //Console.WriteLine("Total number of numbers here: {0}\n", firstLine);

                    while (line_counter <= total_number_of_lines)
                    {
                        lock (this)
                        {
                            temp_number = Convert.ToDouble(sr.ReadLine());
                            Console.WriteLine("{0} here. Readed line: {1}", Thread.CurrentThread.Name, temp_number);
                            if (temp_number % 2 == 0) // If the number is even
                            {
                                sum += temp_number;
                                count++;
                            }
                            line_counter++;
                        }
                        //Interlocked.Increment(ref line_counter);

                    }
                    Console.WriteLine("Sum: {0}, Count: {1}", sum, count);

                    sr.Close();
                }


            }
            catch
            {
                Console.WriteLine("{0} Aborted!!", Thread.CurrentThread.Name);
            }
            finally
            {
                Console.WriteLine("{0} Exiting...", Thread.CurrentThread.Name);
            }

        }  


        static void Main(string[] args)
        {
            Program p1 = new Program();
            Stopwatch myWatch = new Stopwatch();   

            // START THE PARALLEL THREAD METHOD            
            Thread[] myThreads = { new Thread(p1.Process), new Thread(p1.Process), new Thread(p1.Process), new Thread(p1.Process) };
            int thread_counter = 1;
            myWatch.Start();
            foreach (Thread myThread in myThreads)
            {
                myThread.IsBackground = true;
                myThread.Start();
                myThread.Name = "Thread" + thread_counter.ToString();
                thread_counter++;
                Console.WriteLine("Started thread: {0}", myThread.Name);
                //Thread.Sleep(1);
            }


            foreach (Thread myThread in myThreads)
            {
                myThread.Join();
            }
            Console.WriteLine("All my threads are done.");
            myWatch.Stop();



            Console.WriteLine("Time consumed with Thread method is = {0} msec", myWatch.ElapsedMilliseconds.ToString());
            myWatch.Reset();


            Console.Read();
        }
    }
}
...