Создать нужное количество потоков программно - C#

Узнай цену своей работы

Формулировка задачи:

Конкретнее, можно ли сократить код, создав цикл или какие либо еще итерации с указанием нужного количества потоков (сейчас их 8)? С потоками работаю недавно, поэтому по рабоче-крестьянски. Собственно код.
Листинг программы
  1. //поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
  2. namespace ConsoleApp1
  3. {
  4. class Program
  5. {
  6. static long n; static long k = 0;
  7. static long[] a;
  8. static void Main(string[] args)
  9. {
  10. Thread potok2 = new Thread(func2); // создание отдельного потока
  11. Thread potok3 = new Thread(func3); // создание отдельного потока
  12. Thread potok4 = new Thread(func4); // создание отдельного потока
  13. Thread potok5 = new Thread(func5); // создание отдельного потока
  14. Thread potok6 = new Thread(func6); // создание отдельного потока
  15. Thread potok7 = new Thread(func7); // создание отдельного потока
  16. Thread potok8 = new Thread(func8); // создание отдельного потока
  17. Console.Write("Задайте диапазон расчета переменных, до..., нажмите Enter: ");
  18. n = Convert.ToInt64(Console.ReadLine());
  19. a = new long[n + 1];
  20. DateTime dold = DateTime.Now;
  21. for (long i = 1; i <= n; i++)
  22. {
  23. a[i] = (long)Math.Pow(i, 3);
  24. }
  25. potok2.Start();
  26. potok3.Start();
  27. potok4.Start();
  28. potok5.Start();
  29. potok6.Start();
  30. potok7.Start();
  31. potok8.Start();
  32. //код исполняемый в потоках
  33. for (long x = 2; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x=x+8)//на 8 потоков
  34. {
  35. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  36. {
  37. long z3 = a[x] + a[y] + 1;
  38. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  39. if (a[z] == z3)
  40. {
  41. k = ++k;
  42. Console.WriteLine(k +" "+ x +" "+ y+" "+z);
  43. }
  44. }
  45. }
  46. //код исполняемый в потоках
  47. potok2.Join(); //ждем выполнения всех потоков
  48. potok3.Join();
  49. potok4.Join();
  50. potok5.Join();
  51. potok6.Join();
  52. potok7.Join();
  53. potok8.Join();
  54. TimeSpan sp = DateTime.Now - dold;
  55. Console.WriteLine(sp);
  56. Console.Write("Программа завершена. Нажмите "Enter" для выхода...");
  57. Console.ReadLine();
  58. }
  59. static void func2()
  60. {
  61. // здесь код, который будет выполняться в отдельном потоке
  62. for (long x = 3; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  63. {
  64. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  65. {
  66. long z3 = a[x] + a[y] + 1;
  67. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  68. if (a[z] == z3)
  69. {
  70. k = ++k;
  71. Console.WriteLine(k + " " + x + " " + y + " " + z);
  72. }
  73. }
  74. }
  75. }
  76. static void func3()
  77. {
  78. //здесь код, который будет выполняться в отдельном потоке
  79. for (long x = 4; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  80. {
  81. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  82. {
  83. long z3 = a[x] + a[y] + 1;
  84. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  85. if (a[z] == z3)
  86. {
  87. k = ++k;
  88. Console.WriteLine(k + " " + x + " " + y + " " + z);
  89. }
  90. }
  91. }
  92. }
  93. static void func4()
  94. {
  95. //здесь код, который будет выполняться в отдельном потоке
  96. for (long x = 5; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x=x+8)//на 8 потоков
  97. {
  98. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  99. {
  100. long z3 = a[x] + a[y] + 1;
  101. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  102. if (a[z] == z3)
  103. {
  104. k = ++k;
  105. Console.WriteLine(k + " " + x + " " + y + " " + z);
  106. }
  107. }
  108. }
  109. }
  110. static void func5()
  111. {
  112. //здесь код, который будет выполняться в отдельном потоке
  113. for (long x = 6; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  114. {
  115. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  116. {
  117. long z3 = a[x] + a[y] + 1;
  118. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  119. if (a[z] == z3)
  120. {
  121. k = ++k;
  122. Console.WriteLine(k + " " + x + " " + y + " " + z);
  123. }
  124. }
  125. }
  126. }
  127. static void func6()
  128. {
  129. //здесь код, который будет выполняться в отдельном потоке
  130. for (long x = 7; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  131. {
  132. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  133. {
  134. long z3 = a[x] + a[y] + 1;
  135. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  136. if (a[z] == z3)
  137. {
  138. k = ++k;
  139. Console.WriteLine(k + " " + x + " " + y + " " + z);
  140. }
  141. }
  142. }
  143. }
  144. static void func7()
  145. {
  146. //здесь код, который будет выполняться в отдельном потоке
  147. for (long x = 8; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  148. {
  149. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  150. {
  151. long z3 = a[x] + a[y] + 1;
  152. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  153. if (a[z] == z3)
  154. {
  155. k = ++k;
  156. Console.WriteLine(k + " " + x + " " + y + " " + z);
  157. }
  158. }
  159. }
  160. }
  161. static void func8()
  162. {
  163. //здесь код, который будет выполняться в отдельном потоке
  164. for (long x = 9; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  165. {
  166. for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  167. {
  168. long z3 = a[x] + a[y] + 1;
  169. long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  170. if (a[z] == z3)
  171. {
  172. k = ++k;
  173. Console.WriteLine(k + " " + x + " " + y + " " + z);
  174. }
  175. }
  176. }
  177. }
  178. }
  179. }
Откликнувшимся + в карму!

Решение задачи: «Создать нужное количество потоков программно»

textual
Листинг программы
  1. //поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
  2. class Program
  3. {
  4.     static long n; static long k = 0;
  5.     static long[] a;
  6.  
  7.     static void Main(string[] args)
  8.     {
  9.         var threads = new List<Thread>();
  10.  
  11.         for (int i = 2; i <= 8; i++)
  12.         {
  13.             int k = i;
  14.             threads.Add(new Thread(() => func(k)));
  15.         }
  16.  
  17.         Console.Write("Задайте диапазон расчета переменных, до..., нажмите Enter: ");
  18.         n = Convert.ToInt64(Console.ReadLine());
  19.         a = new long[n + 1];
  20.  
  21.         DateTime dold = DateTime.Now;
  22.  
  23.         for (long i = 1; i <= n; i++)
  24.         {
  25.             a[i] = (long)Math.Pow(i, 3);
  26.         }
  27.        
  28.         threads.ForEach(t => t.Start());
  29.  
  30.         //код исполняемый в потоках
  31.         func(2);
  32.        
  33.         //код исполняемый в потоках
  34.         threads.ForEach(t => t.Join()); //ждем выполнения всех потоков
  35.      
  36.         TimeSpan sp = DateTime.Now - dold;
  37.         Console.WriteLine(sp);
  38.         Console.Write("Программа завершена. Нажмите "Enter" для выхода...");
  39.         Console.ReadLine();
  40.     }
  41.  
  42.     static void func(long start)
  43.     {
  44.         // здесь код, который будет выполняться в отдельном потоке
  45.         for (long x = start; x <= (long)Math.Pow(((a[n]) - 1) / 2, 1.0 / 3.0); x = x + 8)//на 8 потоков
  46.         {
  47.             for (long y = x; y <= (long)Math.Pow(((a[n]) - 1 - a[x]), 1.0 / 3.0); y++)
  48.             {
  49.                 long z3 = a[x] + a[y] + 1;
  50.                 long z = (long)(Math.Pow(z3, 1.0 / 3.0) + 0.5);
  51.  
  52.                 if (a[z] == z3)
  53.                 {
  54.                     k = ++k;
  55.                     Console.WriteLine(k + "   " + x + "   " + y + "   " + z);
  56.                 }
  57.             }
  58.         }
  59.     }
  60. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы