我正在 Visual Studio 中用 C++ 编写一个程序,以便能够在公园处理一条线。我的所有客户都在公园排队,我希望能够使用多线程和 openmp 为他们提供服务。
当我将编译指示等放入时,我有多个线程同时为我创建的每个客户服务同一个客户,而不是我想要的。
例如,如果我有两个线程和四个客户,那么线程 1 执行客户 1,而线程 2 执行客户 2。那么我希望线程 1 同时执行客户 3 和线程 2 客户 4。我不知道它是否可能或是否有更好的方法,但我需要使用 openMP。
我正在 Visual Studio 中用 C++ 编写一个程序,以便能够在公园处理一条线。我的所有客户都在公园排队,我希望能够使用多线程和 openmp 为他们提供服务。
当我将编译指示等放入时,我有多个线程同时为我创建的每个客户服务同一个客户,而不是我想要的。
例如,如果我有两个线程和四个客户,那么线程 1 执行客户 1,而线程 2 执行客户 2。那么我希望线程 1 同时执行客户 3 和线程 2 客户 4。我不知道它是否可能或是否有更好的方法,但我需要使用 openMP。
您可以将每个迭代关联为客户,并以静态方式将它们(客户)分配给线程。
#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 将执行客户 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 with 迭代的情况,这些迭代执行的工作在时间上会发生很大变化。类似地,在您的情况下,如果您的消费者需要不同的时间来服务。