Создать нужное количество потоков программно - C#
Формулировка задачи:
Конкретнее, можно ли сократить код, создав цикл или какие либо еще итерации с указанием нужного количества потоков (сейчас их 8)?
С потоками работаю недавно, поэтому по рабоче-крестьянски.
Собственно код.
Откликнувшимся + в карму!
//поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
namespace ConsoleApp1
{
class Program
{
static long n; static long k = 0;
static long[] a;
static void Main(string[] args)
{
Thread potok2 = new Thread(func2); // создание отдельного потока
Thread potok3 = new Thread(func3); // создание отдельного потока
Thread potok4 = new Thread(func4); // создание отдельного потока
Thread potok5 = new Thread(func5); // создание отдельного потока
Thread potok6 = new Thread(func6); // создание отдельного потока
Thread potok7 = new Thread(func7); // создание отдельного потока
Thread potok8 = new Thread(func8); // создание отдельного потока
Console.Write("Задайте диапазон расчета переменных, до..., нажмите Enter: ");
n = Convert.ToInt64(Console.ReadLine());
a = new long[n + 1];
DateTime dold = DateTime.Now;
for (long i = 1; i <= n; i++)
{
a[i] = (long)Math.Pow(i, 3);
}
potok2.Start();
potok3.Start();
potok4.Start();
potok5.Start();
potok6.Start();
potok7.Start();
potok8.Start();
//код исполняемый в потоках
for (long x = 2; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x=x+8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k +" "+ x +" "+ y+" "+z);
}
}
}
//код исполняемый в потоках
potok2.Join(); //ждем выполнения всех потоков
potok3.Join();
potok4.Join();
potok5.Join();
potok6.Join();
potok7.Join();
potok8.Join();
TimeSpan sp = DateTime.Now - dold;
Console.WriteLine(sp);
Console.Write("Программа завершена. Нажмите "Enter" для выхода...");
Console.ReadLine();
}
static void func2()
{
// здесь код, который будет выполняться в отдельном потоке
for (long x = 3; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func3()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 4; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func4()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 5; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x=x+8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func5()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 6; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func6()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 7; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func7()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 8; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
static void func8()
{
//здесь код, который будет выполняться в отдельном потоке
for (long x = 9; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
}
}Решение задачи: «Создать нужное количество потоков программно»
textual
Листинг программы
//поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
class Program
{
static long n; static long k = 0;
static long[] a;
static void Main(string[] args)
{
var threads = new List<Thread>();
for (int i = 2; i <= 8; i++)
{
int k = i;
threads.Add(new Thread(() => func(k)));
}
Console.Write("Задайте диапазон расчета переменных, до..., нажмите Enter: ");
n = Convert.ToInt64(Console.ReadLine());
a = new long[n + 1];
DateTime dold = DateTime.Now;
for (long i = 1; i <= n; i++)
{
a[i] = (long)Math.Pow(i, 3);
}
threads.ForEach(t => t.Start());
//код исполняемый в потоках
func(2);
//код исполняемый в потоках
threads.ForEach(t => t.Join()); //ждем выполнения всех потоков
TimeSpan sp = DateTime.Now - dold;
Console.WriteLine(sp);
Console.Write("Программа завершена. Нажмите "Enter" для выхода...");
Console.ReadLine();
}
static void func(long start)
{
// здесь код, который будет выполняться в отдельном потоке
for (long x = start; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
{
for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
{
long z3 = a[x] + a[y] + 1;
long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
if (a[z] == z3)
{
k = ++k;
Console.WriteLine(k + " " + x + " " + y + " " + z);
}
}
}
}
}