按分区范围线程化



我有一个正在执行的线程向量;但我希望一次完成8个线程,等待完成这8个线程后再继续,而不是一次启动1000个线程(导致大量的上下文切换(;然而,我的代码只执行前8个,然后退出循环。。。不确定原因。感谢您的帮助!

注意:下面的简化代码

for (int _max_orders : max_orders)
{
ThreadVector.emplace_back([=]() {execute_with_params(_max_orders); });
if (++thread_count == 8)
{
for (auto& t : ThreadVector)
{
t.join();
}
thread_count = 0;
}
}

创建线程的简单操作有足够的开销,创建和销毁1000个线程通常会对性能产生显著影响。

与其创建1000个线程,然后一次只执行其中的8个(或任意数量(,我会考虑创建一个由8个线程组成的池。每个线程都将处于一个循环中,以便执行下一个任务。一个简单(但有效(的例子是这样的:

#include <cstdio>
#include <thread>
#include <atomic>
#include <vector>
void execute_with_params(int param) {
std::printf("%dt", param);
}
class next_task {
std::atomic<int> task{0};
std::atomic<int> max;
public:
next_task(int max) : max(max) {}
int operator()() { 
int next = task++; 
return next < max ? next : -1;
}
};
template <class Task>
class executor {
Task &next_task;
public:
executor(Task &t) : next_task(t) {}
void operator()() {
int task;
while (-1 != (task = next_task()))
execute_with_params(task);        
}    
};
int main() {
int num_threads = 8;
next_task tasks(1000);
std::vector<std::thread> threads;
for (int i=0; i<num_threads; i++)
threads.emplace_back(std::thread(executor<next_task>(tasks)));
for (auto &t : threads)
t.join();
}

最新更新