c++ - Qt 线程似乎并没有在核心上平均共享

标签 c++ multithreading qt opengl

我有一个多线程应用程序。但是我注意到,我正在使用 OpenGL,如果没有信号量,这应该无法正常工作。确实如此。我后来添加了信号量,因为它们应该被使用。

不太好的事实是,我现在有一个多线程应用程序,它似乎并没有真正利用 cpu 上的多个线程或内核。

我的负载平衡似乎总是倾向于单核(4 个),差异至少为 40%。

我是否需要在 Qt 的项目文件中切换触发器,还是我忽略了其他内容?可能这种行为是预期的,但如果是这样的话,澄清会很好。

我的平台是 Ubuntu 11.10。

class DrawChunkThread : public QThread
{
    public:
        DrawChunkThread(World *world, int x, int z);
        void run();
        World *world;
        int x;
        int z;
        static QSemaphore *sem;
    private:
};


QSemaphore *DrawChunkThread::sem = new QSemaphore(1);

DrawChunkThread::DrawChunkThread(World *world, int x, int z) {
    this->world = world;
    this->x = x;
    this->z = z;
}

void DrawChunkThread::run()
{
    world->drawChunk(x, z);
    if (world->isInside) {
        world->drawInsideChunk(x, z);
    }
}

最佳答案

如果您添加的信号量创建了一个太长或太竞争(或两者)的关键部分,您将遇到可伸缩性问题,因为并非所有线程都被允许同时执行代码并等待信号量触发上下文切换,这会增加额外的开销。

一般来说,包含串行部分的并行应用程序的扩展不能超过并行部分除以内核数,根据 Amdahl's law .

没有任何具体的代码,我想不出任何其他建议可以给你。

关于c++ - Qt 线程似乎并没有在核心上平均共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9914865/

相关文章:

c++ - dynamic_cast 类型不完整的问题

python - 如何终止选定的线程

java - 不同步 Java 集合的后果

Qt 3D 无法构建图形管道

qt - 如何将 Windows 桌面应用程序转换为 Mac 桌面应用程序?

c++ - const_cast 不适用于 C++?

c++ - 用于 OS X 的 Sublime Text 3 C++ 构建系统

c++ - 如何填充二维字符数组? C++

java - 如何在多线程应用程序中自动更新ConcurrentMap的值?

c++ - QPixmap 的 loadFromData 函数使用了一些奇怪的缓存机制?