[英]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中發現一些k
, r
, u
和dq
命令,這很明顯導致了指針無效引用的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.