下面是一段代码。代码不完整,我省略了释放资源部分和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/pthread/等。
谢谢。
发布于 2011-12-02 00:38:12
错误存在于
用户(ResourceManager& res_holder_,int res_num):resource_holder(resource_holder),resource_to_query(res_num) {}
你应该有
用户(ResourceManager& res_holder_,int res_num):resource_holder(**res_holder_**),resource_to_query(res_num) {}
取而代之!
发布于 2011-12-02 00:30:07
当你遇到访问冲突时(或者在其他平台上,尽管一般来说这是一个糟糕的指针解引用),原因通常是显而易见的……在这种情况下,我不会从你发布的帖子中看到任何东西。根据你所说的,我猜是有什么东西砸坏了堆栈。
然而,给你一点忠告...当你看到无法解释的访问冲突时,第一步是不要发布到Stack Overflow。在调试器中查看它!如果你从微软下载“Windows调试工具”并使用" windbg ",并学习如何使用它,它会告诉你比你想象中更多的关于这次崩溃的信息-它试图访问的坏地址是什么,反汇编WaitForMultipleObjects以便你可以看到它在做什么以及地址来自哪里,等等。我通常会发现在windbg中使用一些k,r,u和dq命令,错误的指针取消引用的原因变得非常明显。
https://stackoverflow.com/questions/8344455
复制相似问题