Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按分区范围划分的线程_C++_Multithreading - Fatal编程技术网

C++ 按分区范围划分的线程

C++ 按分区范围划分的线程,c++,multithreading,C++,Multithreading,我有一个我正在执行的线程向量;但我希望一次完成8个线程,并等待8个线程完成后再继续,而不是一次完成1000个线程(导致大量上下文切换);但是我的代码只执行前8个,然后退出循环。。。不知道为什么。感谢您的帮助 注:简化代码如下 创建线程的简单操作具有足够的开销,因此创建和销毁1000个线程通常会对性能产生显著影响 而不是创建1000个线程,然后一次执行8个(或任意个数),我会考虑创建一个8个线程池。每个线程都将处于一个循环中,以获取要执行的下一个任务。一个简单(但有效)的例子如下: #包括 #包括

我有一个我正在执行的线程向量;但我希望一次完成8个线程,并等待8个线程完成后再继续,而不是一次完成1000个线程(导致大量上下文切换);但是我的代码只执行前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;
        }
    }