Создать многопоточное приложение для определения количество вхождений числа b в массив C - C#
Формулировка задачи:
Задание написать программу
Дана последовательность чисел С = {с0…сn–1} и число b. Создать многопоточное приложение для определения количество вхождений числа b в массив C.
Как я понял в массиве у нас будут хранится номер элементов. Основной поток создает нужное число потоков, число которых задается параметром, каждому из которых передается параметр – номер процесса (или номер части массива, обрабатываемой потоком). Функция потока считает количество вхождений числа b в массив C, а основной поток ждет завершения всех потоков Заранее, большое спасибо! Вот есть похожая задачка для примера, но я все равно не понимаю Дана последовательность натуральных чисел a0, …, a99. Создать поточное приложение для поиска суммы квадратов ∑ai2using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
namespace MultiThread
{
class Program
{static int []a=new int [1000];
static int n;
static void ThreadFunc(int param, out int sum) //Функция потока
{
int i,nt,beg,h,end;
sum=0;
nt=param;
h=1000/n;
beg = h*nt;end=beg+h;
if (nt==n-1)
end=1000;
Console.WriteLine("Поток {0} начало {1} конец {2}",nt,beg,end);
for(i=beg;i<end;i++) sum += a[i]*a[i];
}
static void Main(string[] args)
{n=Convert.ToInt32(args[0]);
Stopwatch sWatch = new Stopwatch();
short start1, finish1,start2,finish2;
int i;
Thread [] thread =new Thread[n];
int [] s1=new int[n];
int rez=0,s = 0;
int[] x = new int[n];
for (i=0;i<100;i++)
a[i] = i;
sWatch.Start();
//создание n дочерних потоков
for (i=0;i<n;i++)
{x[i]= i;thread[i] = new Thread(()=>ThreadFunc(x[i],out s1[i]));
thread[i].Start(); thread[i].Join();
}
for(i=0;i<n;i++) rez+=s1[i];
sWatch.Stop();
Console.WriteLine (sWatch.ElapsedMilliseconds.ToString());
Console.WriteLine("Сумма квадратов с {0} потоками = {1}",n,rez);
sWatch.Start();
for (i = 0; i < 1000; i++) s += a[i]*a[i];
sWatch.Stop();
Console.WriteLine(sWatch.ElapsedMilliseconds.ToString());
Console.WriteLine("Сумма квадратов без потоков = {0}", s);
Console.ReadLine();
}
}
}Решение задачи: «Создать многопоточное приложение для определения количество вхождений числа b в массив C»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
namespace ConsoleApplication173
{
class Program
{
static int[] C = new int[1000];
static int n;
static int b;//наше число
static int[] sl;
static void ThreadFunc(int param)//функия потока
{
int i, nt, beg, h, end;
nt = param;
var res = 0;
h = 1000 / n;
beg = h * nt;
end = beg + h;
if (nt == n - 1)
end = 1000;
Console.WriteLine("Поток {0} начало {1} конец {2}", nt, beg, end);
for (i = beg; i < end; i++)
{
if (C[i] == b)
res++;
}
Console.WriteLine("Поток {0} стоп", nt);
sl[param] = res;
}
static void Main(string[] args)
{
Console.WriteLine("Введите число");
b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите количество потоков");
n = Convert.ToInt32(Console.ReadLine());
Stopwatch sWatch = new Stopwatch();
//short start1, finish1, start2, finish2;
int i;
Thread[] thead = new Thread[n];
sl = new int[n];
int rez = 0;
for (i = 0; i < 1000; i++)
C[i] = i;
sWatch.Start();
//Cоздание дочерних потоков
for (i = 0; i < n; i++)
{
var temp = i;
thead[i] = new Thread(() => ThreadFunc(temp));
thead[i].Start();
}
for (i = 0; i < n; i++)
{
thead[i].Join();
rez += sl[i];
}
sWatch.Stop();
Console.WriteLine("Число вхождений в массив {0} потоками ={1}", n, rez);
Console.WriteLine("Время:{0}", sWatch.ElapsedMilliseconds.ToString());
sWatch.Start();
int res = 0;
for (i = 0; i < 1000; i++)
if (C[i] == b)
res++;
sWatch.Stop();
Console.WriteLine("Число вхождений в массив без потоков ={0}", res);
Console.WriteLine("Время:{0}", sWatch.ElapsedMilliseconds.ToString());
Console.ReadLine();
}
}
}