使用多线程来模拟这个有什么好方法?

时间:2012-11-19 22:40:44

标签: c++ multithreading visual-studio-2010 parallel-processing openmp

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

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

我想要例如,如果我有两个线程和四个客户,那个线程一个做客户一个而线程2做客户2.然后我想线程1做客户3和线程2客户4同时。我不知道它是否可能或者是否有更好的方法,但我需要使用openmp。感谢您的投入。

1 个答案:

答案 0 :(得分:1)

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

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

}

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

在你的2个线程和4个客户的例子中,你将使用CHUNKSIZE = 1.因此,线程0将同时执行costumer 0和2,而线程2将执行costumer 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 的情况,迭代执行时间可能变化很大的工作。类似于您的情况,如果您有消费者需要服务不同的时间。