diff options
| author | Ian Bertolacci <ian.bertolacci@gmail.com> | 2015-07-19 19:59:30 -0700 | 
|---|---|---|
| committer | Ian Bertolacci <ian.bertolacci@gmail.com> | 2015-07-19 19:59:30 -0700 | 
| commit | 155bf5d0a285de2c4dec4033c8e9c20f6a42072b (patch) | |
| tree | ab074e198229a568d4861b21709c16d7deb47aca | |
| parent | bad5266d05485cd61ab1aa0884180ab78738cd9b (diff) | |
Added sync, single, and atomic vars.
| -rw-r--r-- | chapel.html.markdown | 78 | 
1 files changed, 77 insertions, 1 deletions
| diff --git a/chapel.html.markdown b/chapel.html.markdown index 7ac73bbb..4f857775 100644 --- a/chapel.html.markdown +++ b/chapel.html.markdown @@ -757,6 +757,83 @@ timer.clear( );  [ val in myBigArray ] val = 1 / val;   // or iterate over indicies  [ idx in myBigArray.domain ] myBigArray[idx] = -myBigArray[idx];  + +proc countdown( seconds: int ){ +  for i in 1..seconds by -1 { +    writeln( i ); +    sleep( 1 ); +  } +} + +// sync vars have two states: empty and full. +// If you read an empty variable or write a full variable, you are waited +// until the variable is full or empty again +var someSyncVar$: sync int; // varName$ is a convention not a law. +sync { +  begin { +    writeln( "Waiting to read" ); +    var read_sync = someSyncVar$; +    writeln( "value is ", read_sync ); +  } + +  begin { +    writeln( "Writing in..." ); +    countdown( 3 ); +    someSyncVar$ = 123;     +  } +} + +// single vars can only be written once. A read on an unwritten single results +// in a wait, but when the variable has a value it can be read indefinitely +var someSingleVar$: single int; // varName$ is a convention not a law. +sync { +  begin { +    writeln( "Waiting to read" ); +    for i in 1..5 { +      var read_single = someSingleVar$; +      writeln( i,"th time around an the value is ", read_single ); +    } +  } + +  begin { +    writeln( "Writing in..." ); +    countdown( 3 ); +    someSingleVar$ = 5; // first and only write ever. +  } +} + +// atomic variables can be of type bool, int, uint, and real of any size. +var uranium: atomic int; +uranium.write( 238 ); // atomically write a variable +writeln( uranium.read() ); // atomically read a variable +// operations are described as functions, you could define your own operators. +uranium.sub( 3 ); // atomically subtract a variable +writeln( uranium.read() ); +var replaceWith = 239; +var was = uranium.exchange( replaceWith );  +writeln( "uranium was ", was, " but is now ", replaceWith ); +var isEqualTo = 235; +if uranium.compareExchange( isEqualTo, replaceWith ) { +  writeln( "uranium was equal to ", isEqualTo,  +           " so replaced value with ", replaceWith ); +} else { +  writeln( "uranium was not equal to ", isEqualTo,  +           " value stays the same...  whatever it was" ); +} + +sync { +  begin { +    writeln( "Waiting to for uranium to be ", isEqualTo ); +    uranium.waitFor( isEqualTo ); +    writeln( "Uranium was set (by someone) to ", isEqualTo ); +  } + +  begin { +    writeln( "Waiting to write uranium to ", isEqualTo ); +    countdown( 3 ); +    uranium.write( isEqualTo ); +  } +}  ```  Who is this tutorial for? @@ -771,7 +848,6 @@ Occasionally check back here and on the [Chapel site](http://chapel.cray.com) to  ### What this tutorial is lacking:   * Modules and standard modules - * Synchronize variables and atomic operations   * Multiple Locales (distributed memory system)   * ```proc main(){ ... }```   * Records | 
