C++ 按分区范围划分的线程
我有一个我正在执行的线程向量;但我希望一次完成8个线程,并等待8个线程完成后再继续,而不是一次完成1000个线程(导致大量上下文切换);但是我的代码只执行前8个,然后退出循环。。。不知道为什么。感谢您的帮助 注:简化代码如下C++ 按分区范围划分的线程,c++,multithreading,C++,Multithreading,我有一个我正在执行的线程向量;但我希望一次完成8个线程,并等待8个线程完成后再继续,而不是一次完成1000个线程(导致大量上下文切换);但是我的代码只执行前8个,然后退出循环。。。不知道为什么。感谢您的帮助 注:简化代码如下 创建线程的简单操作具有足够的开销,因此创建和销毁1000个线程通常会对性能产生显著影响 而不是创建1000个线程,然后一次执行8个(或任意个数),我会考虑创建一个8个线程池。每个线程都将处于一个循环中,以获取要执行的下一个任务。一个简单(但有效)的例子如下: #包括 #包括
创建线程的简单操作具有足够的开销,因此创建和销毁1000个线程通常会对性能产生显著影响 <>而不是创建1000个线程,然后一次执行8个(或任意个数),我会考虑创建一个8个线程池。每个线程都将处于一个循环中,以获取要执行的下一个任务。一个简单(但有效)的例子如下:
#包括
#包括
#包括
#包括
使用参数(int-param)执行{
std::printf(“%d\t”,参数);
}
下课{
std::原子任务{0};
std::原子最大值;
公众:
下一个任务(int max):max(max){
int运算符(){
int next=task++;
返回下一个 对于(inti=0;i而言,创建线程的简单操作具有足够的开销,因此创建和销毁1000个线程通常会对性能产生显著影响
而不是创建1000个线程,然后只执行8个(或任意个数),我会考虑创建一个8个线程池。每个线程都会坐在一个循环中执行下一个任务。一个简单的(但工作的)例子是这样的:
#包括
#包括
#包括
#包括
使用参数(int-param)执行{
std::printf(“%d\t”,参数);
}
下课{
std::原子任务{0};
std::原子最大值;
公众:
下一个任务(int max):max(max){
int运算符(){
int next=task++;
返回下一个 对于(int i=0;i您可能需要添加ThreadVector.clear()
加入所有已完成的线程后。此简化程序实际上存在相同的问题吗?发布一个完全简化的可编译程序进行演示。此外,与其使用单独的变量thread\u count
不如使用向量的大小ThreadVector.size()
这样就可以完美地跟踪你有多少线程。奇怪的是,为什么不直接使用std::async
和futures。或者,一个固定大小的工作组可以工作(但编写代码会有点麻烦)。你可能需要添加一个ThreadVector.clear()
加入所有已完成的线程后。此简化程序实际上存在相同的问题吗?发布一个完全简化的可编译程序进行演示。此外,与其使用单独的变量thread\u count
不如使用向量的大小ThreadVector.size()
因为它可以完美地跟踪你有多少线程。奇怪的是,为什么不直接使用std::async
和futures。或者,一个固定大小的工作组也可以工作(但编写代码会有点麻烦)。
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;
}
}