Index: doc/theses/thierry_delisle/text/together.tex
===================================================================
--- doc/theses/thierry_delisle/text/together.tex	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/thierry_delisle/text/together.tex	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,140 @@
+% ======================================================================
+% ======================================================================
+\chapter{Putting It All Together}
+% ======================================================================
+% ======================================================================
+
+
+\section{Threads As Monitors}
+As it was subtly alluded in section \ref{threads}, \code{thread}s in \CFA are in fact monitors, which means that all monitor features are available when using threads. For example, here is a very simple two thread pipeline that could be used for a simulator of a game engine:
+\begin{figure}[H]
+\begin{cfacode}[caption={Toy simulator using \code{thread}s and \code{monitor}s.},label={lst:engine-v1}]
+// Visualization declaration
+thread Renderer {} renderer;
+Frame * simulate( Simulator & this );
+
+// Simulation declaration
+thread Simulator{} simulator;
+void render( Renderer & this );
+
+// Blocking call used as communication
+void draw( Renderer & mutex this, Frame * frame );
+
+// Simulation loop
+void main( Simulator & this ) {
+	while( true ) {
+		Frame * frame = simulate( this );
+		draw( renderer, frame );
+	}
+}
+
+// Rendering loop
+void main( Renderer & this ) {
+	while( true ) {
+		waitfor( draw, this );
+		render( this );
+	}
+}
+\end{cfacode}
+\end{figure}
+One of the obvious complaints of the previous code snippet (other than its toy-like simplicity) is that it does not handle exit conditions and just goes on forever. Luckily, the monitor semantics can also be used to clearly enforce a shutdown order in a concise manner:
+\begin{figure}[H]
+\begin{cfacode}[caption={Same toy simulator with proper termination condition.},label={lst:engine-v2}]
+// Visualization declaration
+thread Renderer {} renderer;
+Frame * simulate( Simulator & this );
+
+// Simulation declaration
+thread Simulator{} simulator;
+void render( Renderer & this );
+
+// Blocking call used as communication
+void draw( Renderer & mutex this, Frame * frame );
+
+// Simulation loop
+void main( Simulator & this ) {
+	while( true ) {
+		Frame * frame = simulate( this );
+		draw( renderer, frame );
+
+		// Exit main loop after the last frame
+		if( frame->is_last ) break;
+	}
+}
+
+// Rendering loop
+void main( Renderer & this ) {
+	while( true ) {
+		   waitfor( draw, this );
+		or waitfor( ^?{}, this ) {
+			// Add an exit condition
+			break;
+		}
+
+		render( this );
+	}
+}
+
+// Call destructor for simulator once simulator finishes
+// Call destructor for renderer to signify shutdown
+\end{cfacode}
+\end{figure}
+
+\section{Fibers \& Threads}
+As mentioned in section \ref{preemption}, \CFA uses preemptive threads by default but can use fibers on demand. Currently, using fibers is done by adding the following line of code to the program~:
+\begin{cfacode}
+unsigned int default_preemption() {
+	return 0;
+}
+\end{cfacode}
+This function is called by the kernel to fetch the default preemption rate, where 0 signifies an infinite time-slice, i.e., no preemption. However, once clusters are fully implemented, it will be possible to create fibers and \glspl{uthread} in the same system, as in listing \ref{lst:fiber-uthread}
+\begin{figure}
+\begin{cfacode}[caption={Using fibers and \glspl{uthread} side-by-side in \CFA},label={lst:fiber-uthread}]
+//Cluster forward declaration
+struct cluster;
+
+//Processor forward declaration
+struct processor;
+
+//Construct clusters with a preemption rate
+void ?{}(cluster& this, unsigned int rate);
+//Construct processor and add it to cluster
+void ?{}(processor& this, cluster& cluster);
+//Construct thread and schedule it on cluster
+void ?{}(thread& this, cluster& cluster);
+
+//Declare two clusters
+cluster thread_cluster = { 10`ms };			//Preempt every 10 ms
+cluster fibers_cluster = { 0 };				//Never preempt
+
+//Construct 4 processors
+processor processors[4] = {
+	//2 for the thread cluster
+	thread_cluster;
+	thread_cluster;
+	//2 for the fibers cluster
+	fibers_cluster;
+	fibers_cluster;
+};
+
+//Declares thread
+thread UThread {};
+void ?{}(UThread& this) {
+	//Construct underlying thread to automatically
+	//be scheduled on the thread cluster
+	(this){ thread_cluster }
+}
+
+void main(UThread & this);
+
+//Declares fibers
+thread Fiber {};
+void ?{}(Fiber& this) {
+	//Construct underlying thread to automatically
+	//be scheduled on the fiber cluster
+	(this.__thread){ fibers_cluster }
+}
+
+void main(Fiber & this);
+\end{cfacode}
+\end{figure}
