【问题标题】:Problem with pipeline implementation管道实施的问题
【发布时间】:2011-06-07 12:35:37
【问题描述】:

我创建了一个应用程序,它使用管道模式进行一些处理。 但是,我注意到当管道连续运行多次时,它往往会变得越来越慢。

在流水线阶段没有进行实际处理时也会出现这种情况 - 所以我很好奇我的流水线实现是否有问题。

这是一个重现效果的简单测试程序:

#include <iostream>
#include <boost/thread.hpp>

class Pipeline {

    void processStage(int i) {

        return;
    }


public:

    void run() {


        boost::thread_group threads;

        for (int i=0; i< 8; ++i) {

            threads.add_thread(new boost::thread(&Pipeline::processStage, this, i));
        }

        threads.join_all();
    }
};



int main() {


    Pipeline pipeline;

    int n=2000;
    for (int i=0;i<n; ++i) {

            pipeline.run();

            if (((i+1)*100)/n > (i*100)/n) 
                std::cout << "\r" << ((i+1)*100)/n << " %";
    }

}

据我了解,线程是在 run() 中创建的,并在 run() 结束时终止。所以在主程序中外循环开始时程序的状态应该一直是一样的……

但我观察到处理此循环时速度越来越慢。

我知道在整个程序中保持管道线程处于活动状态会更有效 - 但我需要知道我的管道实现是否存在问题。

谢谢! 康斯坦丁

【问题讨论】:

  • 对我来说看起来是正确的,一定是其他一些副作用
  • 在我看来,所有这些代码基准测试都是您的操作系统创建和销毁线程的速度。这有什么用?
  • @ildjam:此代码无意使用 - 它是重现所描述效果的最少代码。
  • 它是循环执行的次数.. 几乎像 2000 * 8 次

标签: c++ multithreading boost pipeline


【解决方案1】:

我不知道 run() 速度变慢的确切原因,但是当我使用上面的代码并在 main() 的循环末尾插入一点睡眠(500 毫秒)时,run() 速度变慢离开了。所以系统似乎需要一些“恢复时间”才能创建新线程。

【讨论】:

    【解决方案2】:

    既然你做了 new boost::thread() 你有没有尝试清理它们?如果您在 Windows 上运行,请参阅任务管理器以了解进程打开的线程数,并在需要时关闭线程句柄。我怀疑,系统创建的线程数一直在增加..

    【讨论】:

    • boost::thread_group 析构函数将删除组中的所有thread 对象,所以这不会是问题。
    猜你喜欢
    • 2022-12-18
    • 2020-04-16
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多