about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/channel.mu43
1 files changed, 43 insertions, 0 deletions
diff --git a/cpp/channel.mu b/cpp/channel.mu
new file mode 100644
index 00000000..c20fa804
--- /dev/null
+++ b/cpp/channel.mu
@@ -0,0 +1,43 @@
+recipe producer [
+  # produce numbers 1 to 5 on a channel
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- next-ingredient
+  # n = 0
+  n:integer <- copy 0:literal
+  {
+    done?:boolean <- lesser-than n:integer, 5:literal
+    break-unless done?:boolean
+    # other threads might get between these prints
+    $print [produce: ]
+    $print n:integer
+    $print [
+]
+    chan:address:channel <- write chan:address:channel, n:integer
+    n:integer <- add n:integer, 1:literal
+    loop
+  }
+]
+
+recipe consumer [
+  # consume and print integers from a channel
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- next-ingredient
+  {
+    # read an integer from the channel
+    n:integer, chan:address:channel <- read chan:address:channel
+    # other threads might get between these prints
+    $print [consume: ]
+    $print n:integer
+    $print [
+]
+    loop
+  }
+]
+
+recipe main [
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- init-channel 3:literal
+  # create two background 'routines' that communicate by a channel
+  routine1:integer <- start-running consumer:recipe, chan:address:channel
+  routine2:integer <- start-running producer:recipe, chan:address:channel
+]