Создать нужное количество потоков программно - 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);
                }
            }
        }
    }
}

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


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

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

12   голосов , оценка 3.5 из 5
Похожие ответы