WaitForSingleObject crashes

WaitForSingleObject crashes

本文关键字:crashes WaitForSingleObject      更新时间:2023-10-16

下面是代码。代码不完整,我省略了释放资源部分和QueryRes逻辑的实现。

#define N 5
/*simply resources manager which has N shared resources*/
class ResourceManager
{
public:
    ResourceManager()
    {
            for (int i = 0; i < N; ++i)
              resources[i] = CreateMutex(NULL, FALSE, NULL);
    }
/*CreateMutex for on resources array in ctor*/
/*CloseHandle() in dtor and ReleaseMutex in another function which is called after QueryRes*/
        void QueryRes(int i)
        {
          WaitForSingleObject(resources[i], INFINITE); //(*) Here is the problem
        }
private:
        HANDLE resources[N];
};
/*User who asks for resource time-to-time*/
class User
{
public:
    User(ResourceManager& res_holder_, int res_num) : resource_holder(resource_holder), resource_to_query(res_num) {}
    void WorkWithResource()
    {
            while(1)
            {
                    resource_holder.QueryRes(resource_to_query);
            }
    }

    static void Run (void* params)
    {
            static_cast<User*>(params)->WorkWithResource();
    }
private:
    ResourceManager& resource_holder;
    int resource_to_query;
};
int main()
{
        ResourceManager resource_manager;
        User* users[5];
        HANDLE threads[5];
        for (size_t i = 0 ; i < 5; ++i)
        {
                users[i] = new User(resource_manager, i % 5);
                threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&User::Run, users[i], 0, NULL);
        }
        WaitForMultipleObjects(5, threads, true, INFINITE);

        return 0;
}

在(*)的地方,我得到一个"访问冲突异常",当函数做WaitForSingleObject已经锁定互斥锁。

我也试过

 while(WaitForSingleObject(resources[i], INFINITE) != WAIT_OBJECT_0) 

,得到相同的结果。

为什么会出现异常?

我尝试了vc2003,2008和2010。我不能使用boost/pthreads/etc.

谢谢。

错误在

的构造函数中
User(ResourceManager& res_holder_, int res_num) : resource_holder(resource_holder), resource_to_query(res_num)    {   }

你应该有

User(ResourceManager& res_holder_, int res_num) : resource_holder(**res_holder_**), resource_to_query(res_num)    {   }

相反!

当您遇到访问冲突(或在其他平台中的段错误,尽管一般来说这是一个糟糕的指针解引用)时,通常从代码中可以明显看出原因…在这种情况下,我从你的帖子中什么也看不出来。根据你所说的,我猜是有东西打碎了堆栈。

然而,一点建议…当您看到无法解释的访问冲突时,第一步是不要将其发布到Stack Overflow。在调试器中看看它!如果你从微软下载"Windows调试工具"并使用"windbg",并且学习如何使用它,它会告诉你更多关于这次崩溃的信息——它试图访问的错误地址是什么,WaitForMultipleObjects的反汇编,这样你就可以看到它在做什么以及地址来自哪里,等等。我通常发现在windbg中使用一些k, r, udq命令,导致指针解引用不良的原因变得非常明显。