다음 코드는 다음과 같습니다. 코드가 완전하지 않아, 리소스 부분을 해제하고 QueryRes 로직을 구현하지 않았다. (*) 장소에서WaitForSingleObject가 충돌 함
#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;
}
내가 "액세스 위반 예외"GET 함수는 이미 잠긴 뮤텍스에 WaitForSingleObject
을 수행 할 때.
while(WaitForSingleObject(resources[i], INFINITE) != WAIT_OBJECT_0)
을 시도하고 같은 결과를 얻었다.
예외가 발생하는 이유는 무엇입니까?
vc 2003, 2008 및 2010을 시도했습니다. boost/pthreads/etc를 사용할 수 없습니다.
감사합니다.
'ResourceManager'에서 N 값은 얼마입니까? – Pablo
'(HANDLE resources [N];에서)'N '선언을 포함 할 수 있습니까? – hmjd
당신은'ResourceManager'의 생성자를 보여줄 필요가 있습니다. – Chad