pthread比根本没有线程慢

pthread slower than no thread at all

本文关键字:线程 pthread      更新时间:2023-10-16

你好,我试图将线程添加到我的towerdefence中以使其更快,但现在慢了很多。

代码的结构非常简单

主要从sdl开始opengl初始化和初始化一切。然后是游戏循环。无线程顺序:1:键盘和鼠标事件优先2:gameManager3:drawGlScene

gameManager计算一切:移动怪物,攻击怪物,创建攻击动画和声音,检查你是否获胜或放松,如果波浪完成,怪物产卵和功能运行2次,如果速度模式打开。以及其他一些小功能。

drawing函数使用所有数据来绘制所有内容。绘图功能中没有数据修改

我使用的cpu是四核的,下面是视觉部分主中的第一步初始化线程

int main ( int argc, char** argv )
{
 pthread_t t_engine;
 pthread_attr_t attr;
 pthread_attr_init(&attr);
 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

然后所有其他初始化内容和游戏循环的开始从sdl事件切换开始(仍在游戏循环中):

//calculate everything if we are in playing gamestate
    if(id == MODE_PLAY)
    {
        rc = pthread_create(&t_engine, &attr, gameManager, (void *)t);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %dn", rc);
            exit(-1);
        }
        //gameManager((void *)t);
    }
    //draw everything
    DrawGLScene();
if(id == MODE_PLAY)
    {
        rc = pthread_join(t_engine, &status);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %dn", rc);
            exit(-1);
        }
    }

gameManager:

void *gameManager(void *t)
{
  //then lot of stuff
  //function ending like this
  pthread_exit((void*) t);
}

ps:我使用的是windows7,我的ide是代码块,我使用gnu-gcc编译器pps:我也试过mutex、sem和其他东西,但没有什么真正的区别谢谢你花时间帮助我

这一点来自您对问题的解释:

然后所有其他初始化内容和游戏循环的开始

让我相信执行上述pthread_create()/pthread_join()的代码片段是在循环中完成的。

如果是这样的话,请意识到重复创建/销毁线程是非常昂贵的。您需要考虑在gameManger对象中放入一个游戏循环,并使用信号量、条件变量或线程屏障等方法将该循环与执行DrawGLScene()的循环同步。除了使用线程终止作为同步技术之外,几乎什么都可以。