私の関数が行うことは、ブール値の配列を反復処理し、false に設定された要素を見つけると、true に設定されます。この関数は、メモリへのポインターを返すメモリ マネージャー シングルトン クラスのメソッドです。複数のスレッドが関数を呼び出しているため、イテレータがループしているように見え、最初から開始するというエラーが発生します。
void* CNetworkMemoryManager::GetMemory()
{
WaitForSingleObject(hMutexCounter, INFINITE);
if(mCounter >= NetConsts::kNumMemorySlots)
{
mCounter = 0;
}
unsigned int tempCounter = mCounter;
unsigned int start = tempCounter;
while(mUsedSlots[tempCounter])
{
tempCounter++;
if(tempCounter >= NetConsts::kNumMemorySlots)
{
tempCounter = 0;
}
//looped all the way around
if(tempCounter == start)
{
assert(false);
return NULL;
}
}
//return pointer to free space and increment
mCounter = tempCounter + 1;
ReleaseMutex(hMutexCounter);
mUsedSlots[tempCounter] = true;
return mPointers[tempCounter];
}
私のエラーは、ループでオフになるアサートです。私の質問は、関数を修正する方法と、マルチスレッドが原因のエラーですか?
編集: mCounter 変数を保護するためにミューテックスを追加しました。変化なし。エラーは引き続き発生します。