簡體   English   中英

WaitForSingleObject崩潰

[英]WaitForSingleObject crashes

這是下面的代碼。 代碼不完整,我省略了釋放資源部分和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) 

並得到相同的結果。

為什么我會得到例外?

我嘗試使用vc 2003、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。 在調試器中查看它! 如果您從Microsoft下載“用於Windows的調試工具”並使用“ windbg”,並學習如何使用它,它將比您想象的更多地告訴您有關此崩潰的信息-它試圖訪問的錯誤地址是什么,反匯編WaitForMultipleObjects以便可以看到它的作用以及地址的來源,等等。我通常在windbg中發現一些krudq命令,這很明顯導致了指針無效引用的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM