gpt4 book ai didi

c++ - 在循环中 boost Thread_Group 非常慢

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:13 24 4
gpt4 key购买 nike

我想使用线程同时运行检查 vector 中的多个图像。这是代码

        boost::thread_group tGroup;
for (int line = 0;line < sourceImageData.size(); line++) {
for (int pixel = 0;pixel < sourceImageData[line].size();pixel++) {
for (int im = 0;im < m_images.size();im++) {
tGroup.create_thread(boost::bind(&ClassX::ClassXFunction, this, line, pixel, im));
}
tGroup.join_all();
}
}

这将创建线程组并循环遍历像素数据行和每个像素,然后遍历多个图像。这是一个奇怪的项目,但无论如何我将线程绑定(bind)到这个代码所在的类的同一个实例中的一个方法,所以使用了“this”。这会运行大约 20 张图像,绑定(bind)每个线程,然后当它完成循环时,join_all 函数在线程完成时生效。然后它转到下一个像素并重新开始。

我用这个简单的程序测试了同时运行 50 个线程

void run(int index) {
for (int i = 0;i < 100;i++) {
std::cout << "Index : " <<index<<" "<<i << std::endl;
}
}

int main() {
boost::thread_group tGroup;

for (int i = 0;i < 50;i++){
tGroup.create_thread(boost::bind(run, i));
}

tGroup.join_all();
int done;
std::cin >> done;
return 0;
}

这工作起来非常快。尽管在前面的程序中线程绑定(bind)的方法更复杂,但它不应该像现在这样慢。完成一个 sourceImageData(行)循环大约需要 4 秒。我是 boost threading 的新手,所以我不知道嵌套循环或其他方面是否存在明显错误。感谢任何见解。

最佳答案

答案很简单。不要启动那么多线程。考虑启动与逻辑 CPU 内核一样多的线程。启动线程非常昂贵

绝对不要为了完成一件小事而启动一个线程。保留线程并使用任务队列为它们分配大量(小)任务。

这里有一个很好的例子,其中线程数也是一个类似的问题:boost thread throwing exception "thread_resource_error: resource temporarily unavailable"

在这种情况下,我认为您可以通过增加每个任务的大小来获得很多性能(不要为每个像素创建一个,而是例如每个扫描线)

关于c++ - 在循环中 boost Thread_Group 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35642721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com