1. Реализуйте последовательную обработку элементов векторов в соответствии с Вашим вариантом. Число элементов вектора задается параметром N.
2. Реализуйте многопоточную обработку элементов вектора, используя разделение вектора на равное число элементов. Число потоков задается параметром M.
3. Выполните анализ эффективности многопоточной обработки при разных параметрах N (10, 100, 1000, 100000) и M (2, 3, 4, 5, 10) Результаты представьте в табличной форме.
4. Выполните анализ эффективности при усложнении обработки каждого элемента вектора.
Определить максимальный элемент массива, среди элементов, расположенных на нечетных позициях
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
namespace Laba4_2
{
class Program
{
private static int[] arr;
private static Thread[] threads;
private static void ShowArr(int n)
{
Console.Write("\nArray: ");
for (int i = 0; i < n; i++)
Console.Write($"{arr[i],3}");
Console.WriteLine("\n");
}
private static void StartThread(int n, int m)
{
threads = new Thread[m];
var range = (int)Math.Ceiling((double)n / m);
for (int i = 0; i < m; i++)
{
int start = i * range,
end = start + range - 1;
if (start > n - 1)
break;
if (end > n - 1)
end = n - 1;
threads[i] = new Thread(() => {
MaxNum(start, end);
});
threads[i].Name = "Thread " + Convert.ToString(i + 1);
Console.WriteLine("\n{0} \nSearch range from {1} to {2} index", threads[i].Name, start, end);
threads[i].Start();
threads[i].Join();
}
}
private static void MaxNum(int start, int end)
{
int max = arr[0];
for (int i = start; i <= end; i += 2)
{
if (arr[i] > max) max = arr[i];
}
Console.WriteLine("\nMax element array among elements located at odd positions: {0}", max);
}
static void MaxNum(int[] arr, int n)
{
int max = arr[0];
for (int i = 0; i < n; i += 2)
if (arr[i] > max) max = arr[i];
Console.WriteLine("\nMax element array among elements located at odd positions: {0}", max);
}
static void Main(string[] args)
{
Console.WriteLine("Enter number array element");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Enter number threads");
int m = int.Parse(Console.ReadLine());
Random random = new Random();
arr = new int[n];
for (int i = 0; i < n; i++)
{
arr[i] = random.Next(1, 21);
}
ShowArr(n);
Stopwatch sw1 = new Stopwatch();
sw1.Start();
MaxNum(arr, n);
sw1.Stop();
TimeSpan ts1 = sw1.Elapsed;
Console.WriteLine("Total time: {0}", ts1.TotalMilliseconds);
Thread.CurrentThread.Name = "Thread 1";
Stopwatch sw2 = new Stopwatch();
sw2.Start();
Console.WriteLine("{0} main thread start work", Thread.CurrentThread.Name);
StartThread(n, m);
Console.WriteLine("Main thread {0} finish work.", Thread.CurrentThread.Name);
sw2.Stop();
TimeSpan ts2 = sw2.Elapsed;
Console.WriteLine("Total time: {0}", ts2.TotalMilliseconds);
Console.ReadKey();
}
}
} |
|
Мой код не совсем точно работает, когда разделяю массив по частям на потоки то места нечетных и четных индексов путаются и получается не правильный результат. Помоги исправить пожалуйста