我有一个多线程应用程序。但是我注意到,我正在使用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);
}
}
答案 0 :(得分:2)
如果您添加的信号量创建的关键部分太长或太过争议(或两者都有),则会出现可伸缩性问题,因为并非所有线程都允许同时执行代码并等待信号量触发上下文切换,这会增加进一步的开销。
通常,根据Amdahl's law,包含串行部分的并行应用程序的扩展速度不能超过并行部分除以核心数。
没有任何具体的代码,我想不出任何其他建议给你。