【问题标题】:Could I thread this for loop我可以穿这个for循环吗
【发布时间】:2013-03-20 21:21:18
【问题描述】:
for(unsigned int mBlock = 0; mBlock < coords.size(); mBlock++)
{   
    WidgetType widgetType; 
    height = macBlockWidth + coords[mBlock].y;
    width = macBlockHeight + coords[mBlock].x;

    macBlockParent = new QWidget;
    cooefsLink = new QPushButton(macBlockParent);
    macBlock = new QWidget(macBlockParent);
    widgetType.widget = macBlock;
    widgetType.type = (macBlocks[mBlock][2] != 'S') 
                        ? (macBlocks[mBlock][0]) : (macBlocks[mBlock][2]);
    blockWidgetTypes.push_back(widgetType);

    connect(cooefsLink, SIGNAL(released()), 
                                    this, SLOT(showCoefficients()));
    buttonSignals[cooefsLink] = mBlock;

    constructMotionVector(mBlock);
    macBlockLayout->addWidget(macBlockParent, height - 16, width - 16);
    styleMacroBlocks(mBlock);
}

我可以从这个 for 循环中创建一个函数,我可以通过将它分成两个不同的 for 循环来并行操作,这两个循环同时在向量上运行。一个处理前半部分的项目,第二个线程构建下半部分。比如

线程 1

for(unsigned int mBlock = 0; mBlock < coords.size() / 2; mBlock++)
{   
    WidgetType widgetType; 
    height = macBlockWidth + coords[mBlock].y;
    width = macBlockHeight + coords[mBlock].x;

    macBlockParent = new QWidget;
    cooefsLink = new QPushButton(macBlockParent);
    macBlock = new QWidget(macBlockParent);
    widgetType.widget = macBlock;
    widgetType.type = (macBlocks[mBlock][2] != 'S') 
                        ? (macBlocks[mBlock][0]) : (macBlocks[mBlock][2]);
    blockWidgetTypes.push_back(widgetType);

    connect(cooefsLink, SIGNAL(released()), 
                                    this, SLOT(showCoefficients()));
    buttonSignals[cooefsLink] = mBlock;

    constructMotionVector(mBlock);
    macBlockLayout->addWidget(macBlockParent, height - 16, width - 16);
    styleMacroBlocks(mBlock);
}

线程 2

for(unsigned int mBlock = coords.size() / 2; mBlock < coords.size(); mBlock++)
{   
    WidgetType widgetType; 
    height = macBlockWidth + coords[mBlock].y;
    width = macBlockHeight + coords[mBlock].x;

    macBlockParent = new QWidget;
    cooefsLink = new QPushButton(macBlockParent);
    macBlock = new QWidget(macBlockParent);
    widgetType.widget = macBlock;
    widgetType.type = (macBlocks[mBlock][2] != 'S') 
                        ? (macBlocks[mBlock][0]) : (macBlocks[mBlock][2]);
    blockWidgetTypes.push_back(widgetType);

    connect(cooefsLink, SIGNAL(released()), 
                                    this, SLOT(showCoefficients()));
    buttonSignals[cooefsLink] = mBlock;

    constructMotionVector(mBlock);
    macBlockLayout->addWidget(macBlockParent, height - 16, width - 16);
    styleMacroBlocks(mBlock);
}

因为它对我的系统来说是一个真正的瓶颈,我注意到它只使用一个 CPU 并且它会最大化那个 CPU。任何帮助都会非常感谢。

【问题讨论】:

  • 另外我应该提到我知道我提出的简单示例不是非常线程安全的,例如我需要两个不同的 macBlockParent 指针,例如 macBlockParentT1 和 macBlockParentT2。
  • 您是否分析过您的代码以查看是什么占用了 CPU?我不熟悉 QT,所以我在这段代码中看到的只是一些小部件/控件的创建——这不应该是瓶颈,对吧?它到底在哪里?
  • 瓶颈在于创建小部件的 for 循环,在较小分辨率的视频上它很活泼,但我现在正在处理更大的分辨率,构建框架需要很长时间。

标签: c++ multithreading qt


【解决方案1】:

嗯...如果你在两个线程中有这样的构造:blockWidgetTypes.push_back(widgetType);,多线程执行似乎很危险。

【讨论】:

  • 我可以把它拿出来,我知道这很危险,但假设这不是问题,我该如何最好地解决这个问题?
  • @DavidTr,我在这里没有看到任何简单的解决方案。
  • 好的,谢谢,这确实给我的系统造成了瓶颈。
猜你喜欢
  • 2014-01-12
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多