pthread比根本没有线程慢
pthread slower than no thread at all
你好,我试图将线程添加到我的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()
的循环同步。除了使用线程终止作为同步技术之外,几乎什么都可以。
相关文章:
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 使用 pthread 的多线程
- Posix 线程类和启动例程 (pthread)
- 如何修复下一个线程以使其更正确?使用 Pthread
- 如何从父线程中提取 pthread 的任务 id(tid)
- 当其中一个线程在 C++ 中使用 pthread 被杀死时,我如何保持进程的存活
- 读取另一个线程中并发运行的 pthread 的本地数据
- pthread取消成功,但在线程的100个后无法创建线程
- Pthread,杀死JNI创建的线程
- 成员变量的更新值不会在 PTHREAD 中的线程路由函数中重新排列
- 为什么使用 pthread 的 Ubuntu 中的单线程比多线程快
- 当 pthread 启动时,它是否需要互斥锁来访问之前在生成它的线程中写入的全局数据
- C++ pthread,两个线程读取一个全局变量
- pthread 在分离的线程上创建错误 11
- 是否有任何 pthread 函数可以在最后一个线程终止时调用某些内容
- pthread - 使用一个线程访问多个对象
- 停止服务器>如何验证线程是否已停止 ->pthread
- 在静态初始化期间,pthread线程变量何时开始存在
- 线程调度程序模拟:唤醒和睡眠Pthread的正确方法
- 如何在Linux上监视多线程(pthread)C++程序的每个线程行为