我有一个多线程应用程序。然而,我注意到,我正在使用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定律,包含串行部分的并行应用程序的扩展不能超过并行部分除以内核数量。
如果没有任何具体的准则,我想不出任何其他建议可以给你。