Создать нужное количество потоков программно - 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);
- }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д