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