gpt4 book ai didi

c++ - WaitForSingleObject 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 16:29:53 26 4
gpt4 key购买 nike

下面是一段代码。代码不完整,我省略了释放资源部分和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)    {   }

相反!

关于c++ - WaitForSingleObject 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com