C++ 多线程环境中函数出错

C++ 多线程环境中函数出错,c++,multithreading,memory,singleton,C++,Multithreading,Memory,Singleton,我的函数所做的是遍历布尔数组,当找到一个元素集为false时,它就被设置为true。该函数是我的内存管理器单例类中的一个方法,它返回一个指向内存的指针。我遇到了一个错误,迭代器似乎在循环,并在开始时启动,我相信这是因为多个线程正在调用该函数 void* CNetworkMemoryManager::GetMemory() { WaitForSingleObject(hMutexCounter, INFINITE); if(mCounter >= NetConsts

我的函数所做的是遍历布尔数组,当找到一个元素集为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变量。没有变化。错误仍然发生。

我不能说错误是否由多线程引起,但我可以说您的代码不是线程安全的

你用钥匙把锁打开

ReleaseMutex(hMutexCounter);
然后访问tempCounter和Museslots:

mUsedSlots[tempCounter] = true;
return mPointers[tempCounter];
两者都不是常数。这是一场数据竞赛,因为您没有正确序列化对这些变量的访问

将此更改为:

mUsedSlots[tempCounter] = true;
const unsigned int retVal = mPointers[tempCounter];
ReleaseMutex(hMutexCounter);
return retVal;
那么至少你的代码是线程安全的,我不能说这是否解决了你的问题,试试看。在具有多核的机器上,由于数据竞争,会发生非常奇怪的事情


作为一般的最佳实践,我建议查看一些C++11同步功能,如
std::mutex
std::lock\u guard
,这将使您免于自顾自,因为std::lock\u guard会自动释放锁,这样您就不会忘记,而且,在这种情况下,您不能在不经意的情况下过早地完成。这也会使您的代码更易于移植。如果您还没有C++11,请使用boost等效工具。

问题是什么?那么基本上您是在问多线程/并发性是否可能是该函数无法正常工作的原因?是的,我想知道这是否是原因,以及如何修复该函数,如果您知道更多线程可能同时调用此函数,那么请确保以同步方式重写和读取singleton成员的值。