【问题标题】:What is a good method to use with multithreading to simulate this?使用多线程来模拟这个的好方法是什么?
【发布时间】:2012-11-19 22:40:43
【问题描述】:

我正在 Visual Studio 中用 C++ 编写一个程序,以便能够处理公园的线路。我的所有客户都在公园排队,我希望能够使用多线程和 openmp 为他们提供服务。

当我将 pragma 等放入时,我有多个线程同时为我创建的每个客户服务同一个客户,而不是我想要的。

例如,如果我有两个线程和四个客户,那么线程 1 执行客户 1,而线程 2 执行客户 2。那么我希望线程 1 同时执行客户 3 和线程 2 客户 4 .我不知道它是否可能或是否有更好的方法,但我需要使用 openMP。

【问题讨论】:

    标签: c++ multithreading parallel-processing openmp


    【解决方案1】:

    您可以将每个 for 迭代关联为客户,并以静态方式将它们(客户)分配给线程。

    #pragma omp parallel for schedule(static, CHUNKSIZE)
    for(i = 0; i < customer_max; i++)
    {
     // do something with customers 
    
    }
    

    静态:在此分发中,线程在执行实际循环之前静态预先计算其工作。默认情况下,迭代在线程之间平均分配。但是,如果您为参数 CHUNKSIZE 指定一个整数,则分配会将大小为 CHUNKSIZE 的连续迭代块分配给线程。

    在您的示例中,有 2 个线程和 4 个客户,您将使用 CHUNKSIZE = 1。因此,线程 0 将执行客户 0 和客户 2,而线程 2 将执行客户 1 和 3。

    如果你没有指定CHUNKSIZE,线程0会执行前2个客户,线程1会执行剩下的2个。

    另一方面,如果您希望每个线程以动态方式为客户服务,您可以使用动态分布。

        #pragma omp parallel for schedule(dynamic)
        for(i = 0; i < customer_max; i++)
        {
         // do something with customers 
    
        }
    

    动态计划适用于 for 的情况,其中迭代执行的工作在时间上会发生很大变化。与您的情况类似,如果您的消费者需要不同的服务时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多