Распараллеливание потоков на С#

01.01.2001

Распараллеливание потоков на С#
Задача на первый взгляд простая: найти векторное произведение векторов. В итоге ВПВ получается снова вектор, координаты x, y, z которого выщитываются с координат предыдущих векторов. Нужно распараллелить поиск координат на потоки, координаты производимых векторов вводит пользователь.
Загвоздка в том, что потоки берут запрос на те самые данные, поэтому в ответе одна с координат = 0. Нужно заблокировать данные для предотвращения синхронного обращения к ним потоков? Но как? Спасибо за внимание.

Что-то здесь не так (:
namespace VDVwsTHREADS
{
class Program
{
static double x1, x2, y1, y2, z1, z2, x3, y3, z3;

static void Main(string[] args)
{
int n;
Thread Xthreading = new Thread(new ThreadStart(X));
Thread Ythreading = new Thread(new ThreadStart(Y));
Thread Zthreading = new Thread(new ThreadStart(Z));

Console.WriteLine("Векторное произведение векторов. ");
Console.Write("Введите количество повторений ВПВ: ");
n = Convert.ToInt32(Console.ReadLine());
Stopwatch exacttime = new Stopwatch();
Stopwatch NT = new Stopwatch();

for (int i = 1; i <= n; i++)
{
Console.Write("\n\n*********************************************************\nИтерация №: {0} (из {1})", i, n);
Console.Write("\nВведите координаты первого вектора: \nx = ");
x1 = Convert.ToDouble(Console.ReadLine());
Console.Write("y = ");
y1 = Convert.ToDouble(Console.ReadLine());
Console.Write("z = ");
z1 = Convert.ToDouble(Console.ReadLine());

Console.Write("\nВведите координаты второго вектора: \nx = ");
x2 = Convert.ToDouble(Console.ReadLine());
Console.Write("y = ");
y2 = Convert.ToDouble(Console.ReadLine());
Console.Write("z = ");
z2 = Convert.ToDouble(Console.ReadLine());
///////////////////////////////////////////////////////////////////////////////
Console.Write("\nРезультат переумножения двух векторов есть третий вектор. \n");
Console.Write("Третий вектор имеет координаты: \n");
Console.Write(" ...параллельные расчеты... \n");
exacttime.Start();
Xthreading.Start();
Ythreading.Start();
Zthreading.Start();
Console.Write("x = {0}\ny = {1}\nz = {2}", x3, y3, z3);
exacttime.Stop();
//////////////////////////////////////////////////////////////////////////////
Console.Write("\n ...последовательные расчеты... \n");
NT.Start();
Console.Write("\nx = {0}\ny = {1}\nz = {2}", (y1 * z2 - z1 * y2), (z1 * x2 - x1 * z2), (x1 * y2 - y1 * x2));
NT.Stop();
Console.Write("\n*********************************************************");
}

Console.WriteLine("\n\nВремя, утраченное на параллельные расчеты: {0} hh:mm:ss.ms_mcs", exacttime.Elapsed);
Console.WriteLine("\n\nВремя, утраченное на последовательные расчеты: {0} hh:mm:ss.ms_mcs", NT.Elapsed);

Console.ReadKey();
}

static void X()
{
x3 = y1 * z2 - z1 * y2;
}

static void Y()
{
y3 = z1 * x2 - x1 * z2;
}

static void Z()
{
z3 = x1 * y2 - y1 * x2;
}
}
}

Вас заинтересует