source: doc/proposals/concurrency/text/together.tex@ 6840e7c

ADT arm-eh ast-experimental cleanup-dtors enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 6840e7c was 3364962, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

Updated concurrency draft and added new section for implementation.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1% ======================================================================
2% ======================================================================
3\chapter{Putting it all together}
4% ======================================================================
5% ======================================================================
6
7
8\section{Threads as monitors}
9As it was subtely alluded in section \ref{threads}, \code{threads} in \CFA are in fact monitors. This means that all the monitors 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 :
10\begin{cfacode}
11// Visualization declaration
12thread Renderer {} renderer;
13Frame * simulate( Simulator & this );
14
15// Simulation declaration
16thread Simulator{} simulator;
17void render( Renderer & this );
18
19// Blocking call used as communication
20void draw( Renderer & mutex this, Frame * frame );
21
22// Simualation loop
23void main( Simulator & this ) {
24 while( true ) {
25 Frame * frame = simulate( this );
26 draw( renderer, frame );
27 }
28}
29
30// Rendering loop
31void main( Renderer & this ) {
32 while( true ) {
33 waitfor( draw, this );
34 render( this );
35 }
36}
37\end{cfacode}
38One 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 for ever. Luckily, the monitor semantics can also be used to clearly enforce a shutdown order in a concise manner :
39\begin{cfacode}
40// Visualization declaration
41thread Renderer {} renderer;
42Frame * simulate( Simulator & this );
43
44// Simulation declaration
45thread Simulator{} simulator;
46void render( Renderer & this );
47
48// Blocking call used as communication
49void draw( Renderer & mutex this, Frame * frame );
50
51// Simualation loop
52void main( Simulator & this ) {
53 while( true ) {
54 Frame * frame = simulate( this );
55 draw( renderer, frame );
56
57 // Exit main loop after the last frame
58 if( frame->is_last ) break;
59 }
60}
61
62// Rendering loop
63void main( Renderer & this ) {
64 while( true ) {
65 waitfor( draw, this );
66 or waitfor( ^?{}, this ) {
67 // Add an exit condition
68 break;
69 }
70
71 render( this );
72 }
73}
74\end{cfacode}
75
76\section{Fibers \& Threads}
Note: See TracBrowser for help on using the repository browser.