cIsThread: Fixed a race condition on thread start.
This commit is contained in:
@@ -25,23 +25,28 @@ In the descending class' constructor call the Start() method to start the thread
|
||||
class cIsThread
|
||||
{
|
||||
protected:
|
||||
/// This is the main thread entrypoint
|
||||
/** This is the main thread entrypoint.
|
||||
This function, overloaded by the descendants, is called in the new thread. */
|
||||
virtual void Execute(void) = 0;
|
||||
|
||||
/// The overriden Execute() method should check this value periodically and terminate if this is true
|
||||
/** The overriden Execute() method should check this value periodically and terminate if this is true. */
|
||||
volatile bool m_ShouldTerminate;
|
||||
|
||||
private:
|
||||
/** Wrapper for Execute() that waits for the initialization event, to prevent race conditions in thread initialization. */
|
||||
void DoExecute(void);
|
||||
|
||||
public:
|
||||
cIsThread(const AString & a_ThreadName);
|
||||
virtual ~cIsThread();
|
||||
|
||||
/// Starts the thread; returns without waiting for the actual start
|
||||
/** Starts the thread; returns without waiting for the actual start. */
|
||||
bool Start(void);
|
||||
|
||||
/// Signals the thread to terminate and waits until it's finished
|
||||
/** Signals the thread to terminate and waits until it's finished. */
|
||||
void Stop(void);
|
||||
|
||||
/// Waits for the thread to finish. Doesn't signalize the ShouldTerminate flag
|
||||
/** Waits for the thread to finish. Doesn't signalize the ShouldTerminate flag. */
|
||||
bool Wait(void);
|
||||
|
||||
/** Returns true if the thread calling this function is the thread contained within this object. */
|
||||
@@ -50,6 +55,10 @@ public:
|
||||
protected:
|
||||
AString m_ThreadName;
|
||||
std::thread m_Thread;
|
||||
|
||||
/** The event that is used to wait with the thread's execution until the thread object is fully initialized.
|
||||
This prevents the IsCurrentThread() call to fail because of a race-condition. */
|
||||
cEvent m_evtStart;
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user