FBIagent
Erfahrenes Mitglied
Guten Tag,
ich baue mir im Momment einen ThreadPool zusammen. Diesem kann ich Threads
anhängen die auf die ThreadPool Threads verteilt werden. Damit ein ThreadPool Thread
nicht immer wieder in seiner Schleife überprüfen muss ob er einen Thread
zugewisen bekommen hat, wollte ich hier mit SuspendThread() und ResumeThread()
arbeiten.
ThreadPoolWorker.h
ThreadPoolWorker.cpp
Nun ist hierbei das Problem, dass bei Zeile 28 SuspendThread(), wenn ich es in den
Use Lock reinpacke, dieser auch nicht mehr freigegeben und dadurch ein Deadlock
entsteht. Wenn ich es wie jetzt nach dem freigeben des Use Lock lasse gibt es die
möglichkeit, das ResumeThread() in Zeile 43 in ThredPoolWorker::Use() vor dem
SuspendThread() ausgeführt würde.
Hat jemand eine Idee was ich da machen könnte?
Best wishes
FBIagent
ich baue mir im Momment einen ThreadPool zusammen. Diesem kann ich Threads
anhängen die auf die ThreadPool Threads verteilt werden. Damit ein ThreadPool Thread
nicht immer wieder in seiner Schleife überprüfen muss ob er einen Thread
zugewisen bekommen hat, wollte ich hier mit SuspendThread() und ResumeThread()
arbeiten.
ThreadPoolWorker.h
C++:
#ifndef __UTILS_WINAPI_PARALLELISM_THREADPOOLWORKER_H__
#define __UTILS_WINAPI_PARALLELISM_THREADPOOLWORKER_H__
#include ".\Thread.h"
#include ".\ThreadPool.h"
namespace Utils {
namespace WinAPI {
namespace Parallelism {
class ThreadPoolWorker
: public Thread {
friend class ThreadPool;
public:
ThreadPoolWorker();
virtual ~ThreadPoolWorker();
protected:
void Run();
private:
Thread *m_p_Thread;
bool Usable;
bool Use( Thread *pThread );
};
} // namespace Parallelism
} // namespace WinAPI
} // namespace Utils
#endif
ThreadPoolWorker.cpp
C++:
#include ".\ThreadPoolWorker.h"
namespace Utils {
namespace WinAPI {
namespace Parallelism {
////////////////
// Public
ThreadPoolWorker::ThreadPoolWorker()
: Thread(), Usable( true ), m_p_Thread( NULL ) {
}
ThreadPoolWorker::~ThreadPoolWorker() {
}
////////////////
// Protected
void ThreadPoolWorker::Run() {
// TODO: Add notify stop support
while ( true ) {
if ( m_p_Thread != NULL ) {
m_p_Thread->Run();
}
// TODO: Lock Use mutex
Usable = true;
// TODO: Unlock Use mutex
::SuspendThread( Handle() );
}
}
////////////////
// Private
bool ThreadPoolWorker::Use( Thread *pThread ) {
// TODO: Lock Use mutex
if ( !Usable ) {
// TODO: Unlock Use mutex
return false;
}
m_p_Thread = pThread;
Usable = false;
::ResumeThread( Handle() );
// TODO: Unlock Use mutex
return true;
}
} // namespace Parallelism
} // namespace WinAPI
} // namespace Utils
Nun ist hierbei das Problem, dass bei Zeile 28 SuspendThread(), wenn ich es in den
Use Lock reinpacke, dieser auch nicht mehr freigegeben und dadurch ein Deadlock
entsteht. Wenn ich es wie jetzt nach dem freigeben des Use Lock lasse gibt es die
möglichkeit, das ResumeThread() in Zeile 43 in ThredPoolWorker::Use() vor dem
SuspendThread() ausgeführt würde.
Hat jemand eine Idee was ich da machen könnte?
Best wishes
FBIagent
Zuletzt bearbeitet von einem Moderator: