[[Property:title|Thread library overview]] [[Property:weight|1]] [[Property:uuid|2bdeeb91-1917-f443-ebfc-4f877107edd7]] This is only a quick overview of the EiffelThread Library. The class reference for this library should give its complete interface. ==Creating and launching threads: the class THREAD (deferred)== The class of the thread object you want to create should inherit the THREAD class.
Your thread is represented by a class which inherits from THREAD (deferred class).
class MY_THREAD inherit THREAD ... feature execute -- define the deferred feature from THREAD. do ... end ... end -- class MY_THREAD Creating a thread is like creating an Eiffel object: my_thread: MY_THREAD -- MY_THREAD inherits from THREAD and defines -- the deferred procedure `execute' ... create my_thread {{note|You have created a thread object but have not started the thread itself yet.
To run the thread, use the feature launch from THREAD. }} my_thread.launch On the Eiffel side, the procedure execute will be launched. This procedures deferred in class THREAD, you have to define it in MY_THREAD. On the C side, a C thread will be created and launched. {{caution|You may call join_all and the end of the execution of the parent thread if you do not want it to die before its child, otherwise they may prematurely terminate. }} ==The class MUTEX== The implementation of the class MUTEX is mapped on the C standard thread library. An instance of class MUTEX can be shared between different thread. my_mutex.pointer is the pointer to the nested C mutex of my_mutex. * Declaration of the mutex: my_mutex: MUTEX * Creation of mutex: create my_mutex.make * Locking the mutex: my_mutex.lock * Unlocking the mutex: my_mutex.unlock * try_lock: if it is not locked yet, lock the mutex and return True, otherwise it returns False. my_mutex.try_lock * Is my mutex initialized? my_mutex.is_set {{note|on Windows: The MUTEX objects on Windows are recursive while they are not on Unix. A recursive mutex can be locked twice by the same thread. }} {{caution|Be sure that a mutex is unlocked when it is disposed. }} ==The class SEMAPHORE== Like MUTEX, the features of this class are mapped on the C thread library. An instance of class SEMAPHORE can be shared between thread. * Declaration of the semaphore : my_sem: SEMAPHORE Creation of semaphore: initialize semaphore with nb_tokens, it requires nb_tokens > = 0 create my_sem.make (nb_tokens) * Wait for a token: my_sem.wait * Give back a token: my_sem.post * try_wait, similar to try_lock from MUTEX, if a token is available, take it and return True , otherwise return False . my_sem.try_wait {{caution|Be sure that a semaphore does not wait for a token when it is disposed }} ==The class CONDITION_VARIABLE== This class allows to use condition variables in Eiffel. An instance of class CONDITION_VARIABLE can be shared between threads. * Declaration of the condition variable my_cond: CONDITION_VARIABLE * Creation: create my_cond.make * Wait for a signal (send by signal). You need to use a mutex. my_mutex: MUTEX ... create my_mutex.make my_mutex must be locked by the calling thread so as wait can be called. wait atomically unlocks my_mutex and waits for the condition variable my_mutex to receive a signal. As soon as it received a signal, ''my_cond '' locks ''my_mutex '' my_mutex.lock -- You must lock `my_mutex' before calling wait. my_cond.wait (my_mutex) -- Here the critical code to execute when `my_cond' received a signal. my_mutex.unlock -- Unlock the mutex at the end of the critical section. * Send a signal one thread blocked on the condition variable `my_cond'. my_cond.signal * Send a signal to all the threads blocked on the condition variable `my_cond'. my_cond.broadcast {{caution|Be sure that a condition variable is unblocked when it is disposed. }} ==Miscellaneous classes== class THREAD_ATTRIBUTES: defines the attributes of an Eiffel Thread regarding the thread scheduling policy and priority. ==Controlling execution: THREAD_CONTROL== * yield: the calling thread yields its execution in favor of an other thread of same priority. * join_all: the calling thread waits for all other threads to finished (all its children). * A parent thread can wait for the termination of a child process through the feature join of class THREAD_CONTROL (inherited by THREAD): thr: MY_THREAD ... thr.launch ... thr.join