gpt4 book ai didi

c++ - 如何计算固定线程数的均匀分布的作业数?

转载 作者:行者123 更新时间:2023-12-01 14:35:45 24 4
gpt4 key购买 nike

假设我有 tasks 个任务和 threads 个线程来运行它们。每个线程只能运行一次,所以我想通过现有线程平均分配这些任务。为了计算每个线程的任务数,我编写了这个简单的应用程序:

#include <iostream>
using namespace std;

int main(){
int tasks = 15;
int threads = 8;

if(tasks < threads)
threads = tasks;

int tasksPerThread = tasks / threads;

for (int i = 0, start = 1; i < threads; i++) {
start = tasksPerThread * i + 1;
int end = start + tasksPerThread - 1;
if (i == threads - 1 && end < tasks)
end = tasks;
if(start == end)
cout << "Thread " << i + 1 << ": task " << end << endl;
else
cout << "Thread " << i + 1 << ": task " << start << "-" << end << endl;
}
return 0;
}

当有 16 个任务和 8 个线程时,每个线程将获得 2 个任务。但是,在这种情况下,当有 15 个任务和 8 个线程时,我得到以下分布结果:

  • 线程 1:任务 1
  • 线程 2:任务 2
  • 线程 3:任务 3
  • 线程 4:任务 4
  • 线程 5:任务 5
  • 线程 6:任务 6
  • 线程 7:任务 7
  • 线程 8:任务 8-15

与其他线程相比,最后一个线程会执行许多任务,这就是为什么我想将此分布修复为如下所示:

  • 线程 1:任务 1-2
  • 线程 2:任务 3-4
  • 线程 3:任务 5-6
  • 线程 4:任务 7-8
  • 线程 5:任务 9-10
  • 线程 6:任务 11-12
  • 线程 7:任务 13-14
  • 线程 8:任务 15

我需要帮助修复上面的代码以获得这种每个线程都有相似数量的任务要执行的结果。谢谢。

编辑:感谢@shananton 的公式,这是解决方案。

int tasks = 15;
int threads = 8;

if (tasks < threads)
threads = tasks;

int start, usedTasks = 0, tasks_for_this_thread = 0;

for (int i = 0; i < threads; i++) {
usedTasks += tasks_for_this_thread;
start = usedTasks + 1;
tasks_for_this_thread = tasks / threads + (i < tasks % threads);
int end = start + tasks_for_this_thread - 1;

if (start == end)
cout << "Thread " << i + 1 << ": task " << end << endl;
else
cout << "Thread " << i + 1 << ": task " << start << "-" << end << endl;
}

最佳答案

要提前计算每个线程的任务数,可以使用这个公式:

int tasks = 10;
int threads = 3;

for (int i = 0; i < threads; ++i) {
int tasks_for_this_thread = tasks / threads + (i < tasks % threads);
// do whatever you want to
}

例如,对于 10 个任务和 3 个线程,它将任务分配为 4、3、3。

关于c++ - 如何计算固定线程数的均匀分布的作业数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63396032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com