Я хочу прочитать текстовый файл, используя потоки, которые должны работать параллельно. Я знаю кое-что о том, как создавать потоки и синхронизацию (используя 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();
}
}
}