在EnterCriticalSection()

时间:2016-01-03 15:20:02

标签: c multithreading thread-safety access-violation critical-section

我正在研究一个多线程应用程序,它使用关键部分来同步一组实体。该数组保存在结构中,如下所示。 pe数组的每个成员都包含自己的criticalSection,在访问成员之前总是声明它(我已经检查了所有成员)。

struct PlayerEntity {
    DWORD state;
    BOOL onScreen;
    DWORD team;

    DWORD_PTR baseAddr;
    BOOL valid;
    CRITICAL_SECTION critSec;
};

struct EntityList {
    DWORD count;
    PlayerEntity pe[128];
};

EntityList *getStaticEntityList() {
    static EntityList entityList;
    return &entityList;
}

启动应用程序后,两个线程中的一个将在尝试进入临界区时随机抛出异常(下图)。

Exception thrown at 0x00007FFC8813E7C5 (ntdll.dll) in RustExp.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

我假设试图访问其DebugInfo对象的关键部分对象抛出此错误,因为每个对象的DebugInfo指针在初始化后指向0xffffffffffffffff。但是在错误检查之后,它们都指向0xcdcdcdcdcdcdcdcd。

我试图查找有关关键部分对象及其成员的信息,但我似乎无法在其上找到任何内容。所以我问,如果初始化的关键部分对象将其DebugInfo指向0xffffffffffffffff,并且关键部分何时尝试访问其DebugInfo(从而抛出读取错误)?

注意:这在Windows 10上运行。

1 个答案:

答案 0 :(得分:0)

我错误地取消了我的评论。但无论如何我做了一个检查,发现DebugInfo指针在关键部分初始化期间初始化为一个有效的地址,在所有测试期间(进入和离开该部分)保持不变。

如果您在关键部分初始化期间没有任何错误,则应该正确初始化,因此您无法在那里0xFFFFFFFFFFFFFFFF

这只得出一个结论,必须在代码中其他地方发生的内存损坏中搜索问题。