#include <UThread.h>
Public Types | |
enum | Priority { kPLow, kPBelowNormal, kPNormal, kPAboveNormal, kPRealTime } |
![]() | |
typedef THREAD_HANDLE | Handle |
typedef THREAD_HANDLE | Handle |
typedef void(* | Handler) () |
typedef void(* | Handler) () |
Public Member Functions | |
Handle | getThreadHandle () const |
unsigned long | getThreadId () const |
bool | isCreating () const |
bool | isIdle () const |
bool | isKilled () const |
bool | isRunning () const |
void | join (bool killFirst=false) |
void | kill () |
void | setAffinity (int cpu=0) |
void | setPriority (Priority priority) |
void | start () |
UThread (Priority priority=kPNormal) | |
virtual | ~UThread () |
![]() | |
int | Create (Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) const |
int | Create (Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) const |
int | Create (unsigned long &ThreadId, Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) const |
int | Create (unsigned long &ThreadId, Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) const |
virtual | ~UThreadC () |
virtual | ~UThreadC () |
Static Public Member Functions | |
static unsigned long | currentThreadId () |
![]() | |
static int | Create (const Handler &Function, Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) |
static int | Create (const Handler &Function, Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) |
static int | Detach (const Handle &H) |
static int | Detach (Handle H) |
static int | Join (const Handle &H) |
static int | Join (Handle H) |
static int | Kill (const Handle &H) |
static int | Kill (Handle H) |
Private Types | |
enum | State { kSIdle, kSCreating, kSRunning, kSKilled } |
Private Member Functions | |
void | applyAffinity () |
void | applyPriority () |
int | Create (Handle *const &H=0, const bool &CreateDetached=false, const unsigned int &StackSize=0, const bool &CancelEnable=false, const bool &CancelAsync=false) const |
virtual void | mainLoop ()=0 |
virtual void | mainLoopBegin () |
virtual void | mainLoopEnd () |
virtual void | mainLoopKill () |
void | operator= (UThread &) |
void | ThreadMain () |
UThread (const UThread &) | |
Static Private Member Functions | |
static int | Detach (Handle H) |
static int | Join (Handle H) |
static int | Kill (Handle H) |
Private Attributes | |
int | cpuAffinity_ |
Handle | handle_ |
UMutex | killSafelyMutex_ |
Priority | priority_ |
UMutex | runningMutex_ |
State | state_ |
unsigned long | threadId_ |
Additional Inherited Members | |
![]() | |
UThreadC () | |
UThreadC () | |
![]() | |
static void | Exit () |
static void | Exit () |
static Handle | Self () |
static int | Self () |
static void | TestCancel () |
static void | TestCancel () |
The class UThread is an abstract class for creating thread objects. A UThread provides methods to create threads as an object-style fashion.
For most of inherited classes, only mainLoop() needs to be implemented, then only start() needs to be called from the outside. The main loop is called until the thread itself calls kill() or another thread calls kill() or join() (with parameter to true) on this thread. Unlike kill(), join() is a blocking call: the calling thread will wait until this thread has finished, thus join() must not be called inside the mainLoop().
If inside the mainLoop(), at some time, the thread needs to wait on a mutex/semaphore (like for the acquisition of a resource), the function mainLoopKill() should be implemented to release the mutex/semaphore when the thread is killed, to avoid a deadlock. The function killCleanup() is called after the thread's state is set to kSKilled. After the mutex/semaphore is released in killCleanup(), on wake up, the thread can know if it needs to stop by calling isKilled().
To do an initialization process (executed by the worker thread) just one time before entering the mainLoop(), mainLoopBegin() can be implemented.
Example:
enum UThread::Priority |
|
private |
The constructor.
priority | the thread priority |
Definition at line 33 of file UThread.cpp.
|
virtual |
The destructor. Inherited classes must call join(true) inside their destructor to avoid memory leaks where the underlying c-thread is still running.
Note: not safe to delete a thread while other threads are joining it.
Definition at line 41 of file UThread.cpp.
|
private |
Definition at line 208 of file UThread.cpp.
|
private |
Definition at line 162 of file UThread.cpp.
|
private |
|
inlinestatic |
bool UThread::isCreating | ( | ) | const |
Definition at line 240 of file UThread.cpp.
bool UThread::isIdle | ( | ) | const |
Definition at line 250 of file UThread.cpp.
bool UThread::isKilled | ( | ) | const |
Definition at line 255 of file UThread.cpp.
bool UThread::isRunning | ( | ) | const |
Definition at line 245 of file UThread.cpp.
void UThread::join | ( | bool | killFirst = false | ) |
The caller thread will wait until the thread has finished.
Note : blocking call
killFirst | if you want kill() to be called before joining (default false), otherwise not. |
Definition at line 85 of file UThread.cpp.
void UThread::kill | ( | ) |
Kill the thread. This functions does nothing if the thread is not started or is killed.
Note : not a blocking call
Definition at line 48 of file UThread.cpp.
|
privatepure virtual |
Pure virtual method mainLoop(). The inner loop of the thread. This method is called repetitively until the thread is killed. Note that if kill() is called in mainLoopBegin(), mainLoop() is not called, terminating immediately the thread.
Implemented in rtabmap::PreUpdateThread, rtabmap::DBDriver, UCvMat2QImageThread, rtabmap::SensorCaptureThread, UEventsManager, UObjDeletionThread< T >, rtabmap::RtabmapThread, WifiThread, rtabmap::CompressionThread, rtabmap::IMUThread, rtabmap::OdometryThread, and UEventDispatcher.
|
inlineprivatevirtual |
Virtual method mainLoopBegin(). User can implement this function to add a behavior before the main loop is started. It is called once (before entering mainLoop()).
Reimplemented in rtabmap::SensorCaptureThread, rtabmap::RtabmapThread, rtabmap::IMUThread, and rtabmap::OdometryThread.
|
inlineprivatevirtual |
Virtual method mainLoopEnd(). User can implement this function to add a behavior after the thread is killed (after exiting the mainLoop(), work is still done in the thread before exiting).
|
inlineprivatevirtual |
Virtual method mainLoopKill(). User can implement this function to add a behavior before the thread is killed. When this function is called, the state of the thread is set to kSKilled. It is useful to wake up a sleeping thread to finish his loop and to avoid a deadlock.
Reimplemented in rtabmap::SensorCaptureThread, UEventsManager, rtabmap::RtabmapThread, and rtabmap::OdometryThread.
void UThread::setAffinity | ( | int | cpu = 0 | ) |
Set the thread affinity. This is applied during start of the thread.
MAC OS X : http://developer.apple.com/library/mac/#releasenotes/Performance/RN-AffinityAPI/_index.html.
cpu | the cpu id (start at 1), 0 means no affinity (default). |
Definition at line 198 of file UThread.cpp.
void UThread::setPriority | ( | Priority | priority | ) |
Set the thread priority.
priority | the priority |
Definition at line 156 of file UThread.cpp.
void UThread::start | ( | ) |
Start the thread. Once the thread is started, subsequent calls to start() are ignored until the thread is killed.
Definition at line 122 of file UThread.cpp.
|
privatevirtual |
Implements UThreadC< void >.
Definition at line 264 of file UThread.cpp.