mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
68 lines
1.6 KiB
Nim
68 lines
1.6 KiB
Nim
discard """
|
|
matrix: "--threads:on --gc:orc; --threads:on --gc:arc"
|
|
disabled: "freebsd"
|
|
"""
|
|
|
|
import std/channels
|
|
import std/os
|
|
|
|
var chan = newChannel[string]()
|
|
|
|
# This proc will be run in another thread using the threads module.
|
|
proc firstWorker() =
|
|
chan.send("Hello World!")
|
|
|
|
# This is another proc to run in a background thread. This proc takes a while
|
|
# to send the message since it sleeps for 2 seconds (or 2000 milliseconds).
|
|
proc secondWorker() =
|
|
sleep(2000)
|
|
chan.send("Another message")
|
|
|
|
|
|
# Launch the worker.
|
|
var worker1: Thread[void]
|
|
createThread(worker1, firstWorker)
|
|
|
|
# Block until the message arrives, then print it out.
|
|
let dest = chan.recv()
|
|
doAssert dest == "Hello World!"
|
|
|
|
# Wait for the thread to exit before moving on to the next example.
|
|
worker1.joinThread()
|
|
|
|
# Launch the other worker.
|
|
var worker2: Thread[void]
|
|
createThread(worker2, secondWorker)
|
|
# This time, use a non-blocking approach with tryRecv.
|
|
# Since the main thread is not blocked, it could be used to perform other
|
|
# useful work while it waits for data to arrive on the channel.
|
|
|
|
var messages: seq[string]
|
|
var msg = ""
|
|
while true:
|
|
let tried = chan.tryRecv(msg)
|
|
if tried:
|
|
messages.add move(msg)
|
|
break
|
|
|
|
messages.add "Pretend I'm doing useful work..."
|
|
# For this example, sleep in order not to flood stdout with the above
|
|
# message.
|
|
sleep(400)
|
|
|
|
# Wait for the second thread to exit before cleaning up the channel.
|
|
worker2.joinThread()
|
|
|
|
# Clean up the channel.
|
|
doAssert chan.close()
|
|
doAssert messages[^1] == "Another message"
|
|
doAssert messages.len >= 2
|
|
|
|
|
|
block:
|
|
let chan0 = newChannel[int]()
|
|
let chan1 = chan0
|
|
block:
|
|
let chan3 = chan0
|
|
let chan4 = chan0
|