Обработка одного массива несколькими потоками - C#
Формулировка задачи:
Здравствуйте, имеется следующий код:
В примере каждый из двоих потоков обрабатывает массив от 1 до 10 (то есть оба потока обрабатывают каждое число). Каким образом сделать чтобы каждый поток обрабатывал один и тот же массив (к примеру первый поток:1, второй поток:2, первый поток:3, второй поток:4 и т.д.). Требуется для сравнения кол-ва времени, которое нужно для обработки одного массива 2-10 потоками.
И еще - каким образом сделать вывод "за сколько времени" каждый поток полностью выполнил обработку, и сколько времени было потрачено обработки всего массива?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThread1Start = new ThreadStart(new Program().testThread1);
ThreadStart testThread2Start = new ThreadStart(new Program().testThread2);
Thread[] testThread = new Thread[2];
testThread[0] = new Thread(testThread1Start);
testThread[1] = new Thread(testThread2Start);
foreach (Thread myThread in testThread)
{
myThread.Start();
}
Console.ReadLine();
}
public void testThread1()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed "+count+" times");
Thread.Sleep(1);
}
}
public void testThread2()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(1);
}
}
}
}Решение задачи: «Обработка одного массива несколькими потоками»
textual
Листинг программы
using System;
using System.Threading;
using System.Diagnostics;
namespace TestConsoleApp
{
class Program
{
static int[] ar = {0,1,2,3,4,5,6,7,8,9};
static int _lock = 0;
static void Main(string[] args)
{
ThreadStart testThread1Start = new ThreadStart(new Program().testThread1);
ThreadStart testThread2Start = new ThreadStart(new Program().testThread2);
Thread[] testThread = new Thread[2];
testThread[0] = new Thread(testThread1Start);
testThread[1] = new Thread(testThread2Start);
foreach (Thread myThread in testThread)
{
myThread.Start();
}
Console.ReadLine();
}
public void testThread1()
{
Stopwatch sw1 = new Stopwatch();
sw1.Start();
Thread.Sleep(101);
while (_lock < 10)
{
Console.WriteLine("Thread 1 Executed value {0}", GetNext());
Thread.Sleep(1);
}
sw1.Stop();
TimeSpan ts = sw1.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime Thread 1 {0}", elapsedTime);
}
public void testThread2()
{
Stopwatch sw2 = new Stopwatch();
sw2.Start();
Thread.Sleep(100);
while (_lock < 10)
{
Console.WriteLine("Thread 2 Executed value {0}", GetNext());
Thread.Sleep(1);
}
sw2.Stop();
TimeSpan ts = sw2.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime Thread 2 {0}", elapsedTime);
}
static int GetNext()
{
int a = ar[_lock];
_lock += 1;
return a;
}
}
}