私は現在、c ++でマルチスレッド化する方法を学んでおり、そのためにboost::threadを使用しています。3 つのスレッドを実行する単純なゲームエンジンに使用しています。
スレッドのうちの 2 つは、基本的にボール、プレート、ボックスなどの PrimitiveObjects と呼ばれるものの内部に格納されている同じ変数の読み取りと書き込みを行っています。
しかし、私は本当にそれを機能させることができません.問題は、2つのスレッドが同時に同じメモリ位置にアクセスしようとしていることだと思います.ミューテックスロックを使用してこれを回避しようとしましたが、今のところ運がありません.これは機能します時々ですが、スパムすると、次の例外が発生します。
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);
}
これは、各プリミティブ obj を生成するために使用する関数です。(更新しました)
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];
}