c++ - 管道实现问题

标签 c++ multithreading boost pipeline

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

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

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

#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() 结束时终止。所以主程序中外层循环开始时程序的状态应该总是一样的...

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

我知道在整个程序中保持管道线程事件会更有效 - 但我需要知道我的管道实现是否存在问题。

谢谢! 康斯坦丁

最佳答案

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

关于c++ - 管道实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265218/

相关文章:

c++ - 格式化返回指向包含类的指针的函数?

java - 我的静态 util 方法线程安全吗

c++ - 无法针对 OS X 上的 Boost.log 进行编译

c++ - 如何使用 msvc10 和 ICU 编译 boost 1.54?

c++ - 如何为通用 lambda 参数定义模板参数?

c++ - QTimer 插槽没有被调用

c++ - Visual Studio 2012 和 2010 中基于 Opengl Sierpinski Shader 的 C 代码

java - 寻找在多线程平台上创建用户名的好方法

c# - 从多个线程修改 Entity Framework 实体

C++ spirit boost : Making a input iterator into a forward iterator