Libthreadar 1.6.0
|
Class thread is a pure virtual class, that implements thread creation and operations. More...
#include <thread.hpp>
Inherited by libthreadar::thread_signal.
Classes | |
class | cancel_except |
exception used to trigger thread cancellation More... | |
Public Member Functions | |
thread () | |
constructor | |
thread (const thread &ref)=delete | |
copy constructor and assignment operator are disabled | |
thread (thread &&ref) noexcept=default | |
thread & | operator= (const thread &ref)=delete |
thread & | operator= (thread &&ref) noexcept=default |
virtual | ~thread () |
destructor | |
void | reset_stack_size () |
reset the stack size to the system default value More... | |
void | set_stack_size (unsigned int val) |
set the stack size to non default value More... | |
unsigned int | get_stack_size () const |
get the current stack size value More... | |
virtual void | set_signal_mask (const sigset_t &mask) |
set signal mask of the thread spawn by run() More... | |
void | run () |
launch the current object routing in a separated thread | |
bool | is_running () const |
checks whether a separated thread is running the inherited_run() method of this object More... | |
bool | is_running (pthread_t &id) const |
checks whether the object is running in a separated thread More... | |
void | join () const |
the caller will be suspended until the current object's thread ends | |
void | kill () const |
void | cancel () |
the caller send a cancellation request to this object's running thread if any More... | |
Protected Member Functions | |
virtual void | inherited_run ()=0 |
action to be performed in the separated thread (implementation is expected in inherited classes) More... | |
void | cancellation_checkpoint () const |
available withing the inherited_run() method to eventually trigger thread cancellation More... | |
virtual void | inherited_cancel () |
Class thread is a pure virtual class, that implements thread creation and operations.
At the difference of the C++11 thread directive, the creation of an inherited class object does not immediately launch a thread. The inherited class can first provide any fields necessary to the thread execution by mean of inherited class constructor or better by using several customized method of the inherited class, which brings better readability and ease code maintenance than having a call with a lot of argument as C++11 thread managment requests it to be done.
Inherited classes must only define the inherited_run() method, method that will be run in its specific thread once the run() method will be called on that object. The private fields of inherited classes can be used to host variables only accessible by the running thread. Inherited class may also implement method to communicate with the running thread, here too the private (or protected) fields of the class can be used to host mutex if one is necessary to provide consistent information from the current thread to the other interacting with it by mean of adhoc methods of the inherited class.
The join() method can be used by the run() caller to wait for thread termination. If the corresponding thread has already ended, the join() method ends immediately. If the thread aborted due to an exception, this exception will be rethrown from the the thread calling join(). Last, calling join() on an object which thread has not yet started or which has ended and for which join() has already been run, does nothing: the join() method returns immediately.
Once the thread is no more running, a new call to run() is allowed but only if a join() call has been issued since the thread was last run. This allows to run again a thread without having to pass again all the possibly many arguments and datastructures requested by this thread.
Definition at line 101 of file thread.hpp.
void libthreadar::thread::cancel | ( | ) |
the caller send a cancellation request to this object's running thread if any
|
protected |
available withing the inherited_run() method to eventually trigger thread cancellation
void inherited_run() { try { while(something) { ... // code to protect cancellation_checkpoint(); } } catch(cancel_except &) { // eventually release some resource // but propagate the exception! throw; } catch(...) { // a catch-all statement you want/need // not rethrowing the exception } }Of course if the catch-all statement do rethrow all exceptions nothing special is to be done as the cancel_except exception will still be propagated upward and drive the thread cancellation to its end.
|
inline |
get the current stack size value
Definition at line 134 of file thread.hpp.
|
inlineprotectedvirtual |
this method is called by cancel() even if the thread is not running() to let inherited classes define alternative method to stop the thread running inherited_run() than the cancellation_checkpoint() mechanism, or in complement to it. Attention should be taken to the fact the caller of cancel() is not likely to be the same thread as the one running inherited_run(), and mutex or other mechanism may be necessary to avoid concurrent access to some fields in your inherited classes, fields used to communicate the cancellation requested to the thread from the other thread calling cancel().
Definition at line 251 of file thread.hpp.
|
protectedpure virtual |
action to be performed in the separated thread (implementation is expected in inherited classes)
|
inline |
checks whether a separated thread is running the inherited_run() method of this object
Definition at line 146 of file thread.hpp.
bool libthreadar::thread::is_running | ( | pthread_t & | id | ) | const |
checks whether the object is running in a separated thread
[out] | id | returns the thread_id upon success |
void libthreadar::thread::kill | ( | ) | const |
void libthreadar::thread::reset_stack_size | ( | ) |
reset the stack size to the system default value
this method must not be called when the current object has its thread running.
|
inlinevirtual |
set signal mask of the thread spawn by run()
this value persists accros several run()/join() executions.
Reimplemented in libthreadar::thread_signal.
Definition at line 140 of file thread.hpp.
void libthreadar::thread::set_stack_size | ( | unsigned int | val | ) |
set the stack size to non default value
this method must not be called when the current object has its thread running.
[in] | val | size in bytes of the stack to allocate and use. |