我目前正在学习如何使用 c++ 进行多线程,为此我使用 boost::thread。我将它用于一个简单的游戏引擎,运行三个线程。
其中两个线程正在读取和写入相同的变量,这些变量存储在我称为 PrimitiveObjects 的东西中,基本上是球、盘子、盒子等。
但我不能真正让它工作,我认为问题是两个线程试图同时访问相同的内存位置,我试图使用互斥锁来避免这种情况,但现在我没有运气,这行得通有时,但如果我发送垃圾邮件,我最终会遇到这个例外:
First-chance exception at 0x00cbfef9 in TTTTT.exe: 0xC0000005: Access violation reading location 0xdddddded.
Unhandled exception at 0x77d315de in TTTTT.exe: 0xC0000005: Access violation reading location 0xdddddded.
这些是我为此使用的对象内部的函数,调试器也将异常归咎于它们。
int PrimitiveObj::setPos(glm::vec3 in){
boost::try_mutex::scoped_try_lock lock(myMutex);
if ( lock)
{
position = in;
return 1;
}
return 0;
}
glm::vec3 PrimitiveObj::getPos(){
boost::try_mutex::scoped_try_lock lock(myMutex);
if ( lock)
{
glm::vec3 curPos = position;
return curPos;
}
return glm::vec3(0,0,0);
}
这是我用来生成每个原始对象的函数。(更新)
void generatePrimitive(){
PrimitiveObj *obj = new PrimitiveObj();
obj->generate();
obj->setPos(getPlayerPos()+getEye()*4.0f);
prims.push_back(std::shared_ptr<PrimitiveObj>(obj));
}
有任何想法吗?编辑:新函数(2),myMutex 现在是对象私有的。添加了我用来生成原始对象的函数。
编辑:
这是堆栈指向的代码,它在物理线程中运行:
nr = getNumberOfPrimitives();
double currentTime = glfwGetTime();
float deltaTime = float(currentTime - lastTime);
for(int r = 0; r < nr; r++) {
prop = getPrimitive(r);
glm::vec3 pos = prop->getPos()+glm::vec3(0,1.0f*Meter/deltaTime,0);
prop->setPos(pos);
}
其他相关代码:
int getNumberOfPrimitives(){
return prims.size();
}
PrimitiveObj * getPrimitive(int input) {
return prims[input];
}