代码之家  ›  专栏  ›  技术社区  ›  jaks

在C中创建线程池#

  •  1
  • jaks  · 技术社区  · 15 年前

    我有300个线程,正在逐个执行。我使用join,所以它是一个接一个的。我想一次执行N个线程。

    任何人都能告诉我在C(使用N个线程)中创建线程池的链接吗?我的情况是,每次执行N个线程时,其余的线程将等待。当一个线程完成执行时,一个等待的线程将进入执行。

    感谢您提供任何代码片段。谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   David Storfer    15 年前

    我想你可能在找 ThreadPool.QueueUserWorkItem . 使用threadpool可以减少线程创建和销毁的巨大开销。您可以根据可用的硬件调整线程(我的注释中的链接),或者允许系统最好地管理最小/最大同时线程。如果这是一个web应用程序,您可以在web.config中设置它来设置“n”线程号:

       <system.web>
            <processModel minWorkerThreads="50"/>
       </system.web>
    

    如果使用.NET 4.0,还可以使用“parallel.foreach”,它将自动将循环的每次迭代计划到线程池中的多个线程上。(我的评论中的链接)

        2
  •  3
  •   Paul Ruane    15 年前

    Join 不指示线程按顺序运行,它只是使当前线程在继续之前等待指定线程完成。

    因此,如果启动300个线程,然后将它们全部连接起来,300个线程将并行运行,连接线程将在300个线程完成后完成。

    const int COUNT = 300;
    
    // create and start the threads
    var threads = new Thread[COUNT];
    for (int index = 0; index < COUNT; index += 1)
    {
        threads[index] = new Thread(...);
        threads[index].Start();
    }
    
    // now they're running, join them all
    for (int index = 0; index < COUNT; index += 1)
    {
        threads[index].Join();
    }
    
    // we're done
    

    重要的一点是,在开始连接之前启动所有线程,否则在开始下一个线程之前,您将等待每个线程完成,因此它们实际上是连续的。我想这就是你可能在做的?

        3
  •  2
  •   BaBu    15 年前

    如果大多数线程都在等待,您应该查看System.Threading.ThreadPool类。它可能正是你想要的。而且效率很高。