pthread比没有线程慢

时间:2012-08-23 00:32:38

标签: c++ multithreading thread-safety pthreads

您好我试图将线程添加到我的towerdefence中以使其更快但现在速度更慢。

代码的结构非常简单

主要从sdl开始,opengl init和init一切。然后游戏循环。 没有线程顺序: 1:首先是键盘和鼠标事件 2:游戏管理 3:drawGlScene

gameManager计算一切:移动怪物,攻击怪物,创建攻击动画和声音,检查你是否获胜或松动,如果挥手完成,怪物产生并且如果速度模式打开则该功能运行2次。和其他一些小功能。

绘图功能使用所有数据绘制所有内容。使用绘图功能进行0数据修改

我使用的cpu是四核,这里是可视部分 主要

中的第一步init线程
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 %d\n", 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 %d\n", rc);
            exit(-1);
        }
    }

游戏管理:

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

ps:我使用的是Windows 7,我的ide是codeblock,我使用的是gnu gcc编译器 pps:我也试过互斥,sem和其他东西,但没有什么真正的区别 谢谢你花时间帮我(=

1 个答案:

答案 0 :(得分:4)

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

  

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

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

如果是这种情况,请意识到重复创建/销毁线程非常昂贵。您将要考虑在您的gameManger对象中放置一个游戏循环,并使用信号量,条件变量或线程障碍等信息将该循环与执行DrawGLScene()的循环同步。除了使用线程终止作为同步技术之外,几乎所有其他内容。