【问题标题】: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 的情况,其中迭代执行的工作在时间上会发生很大变化。与您的情况类似,如果您的消费者需要不同的服务时间。