我的函數做的是循環遍歷一個布爾數組,並且在找到一個設置爲false的元素時,它被設置爲true。該函數是我的內存管理器singleton類中的一個方法,它返回一個指向內存的指針。我得到一個錯誤,我的迭代器似乎循環並最終從頭開始,我相信這是因爲多個線程正在調用該函數。多線程環境中函數的錯誤
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變量。不用找了。錯誤仍然發生。
這是什麼問題? – juanchopanza 2013-02-17 20:07:58
所以基本上你問是否多線程/併發可能是此功能不能正常工作的原因? – LihO 2013-02-17 20:14:15
是的,我想知道如果這是原因,我該如何修復函數 – user998797 2013-02-17 20:17:45