【发布时间】:2012-03-28 20:07:18
【问题描述】:
我有一个多线程应用程序。但是我注意到,我正在使用 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);
}
}
【问题讨论】:
-
有很多因素需要考虑...将是确定哪个线程消耗多少 CPU 的良好开端...尝试分析
-
你没有说你使用的是哪个平台。无论如何,您可能会发现您的代码正在被序列化,因为您的所有线程可能都在访问单个资源。更糟糕的是,如果您对缓存不友好或过度使用临界区等,您可能会遇到很多问题,这可能会导致线程性能不佳。
-
您使用哪种语言?是 C++ 吗?请添加语言标签,因为您使用的标签不会为您的问题提供必要的可见性。
-
OpenGL 无法绘制多线程。您的绘图调用最终将被序列化,以便驱动程序可以一一执行它们。所以在某些时候你最终会遇到一个关键部分。绘制调用的线程提交与线程执行不同。至少这是我的理解:-)。在英特尔网站的某个地方,有一个关于 Civ V 多线程渲染的精彩研讨会。我建议你去追捕它,因为它有很多重要的技巧。抱歉,我现在找不到。
-
但是使用 OpenGL 向部分添加信号量可以解决这个问题,对吗?
标签: c++ multithreading qt opengl