From 88a4fcd946004868bdb640989d3543532c5247c3 Mon Sep 17 00:00:00 2001 From: "Robert G. Jakabosky" Date: Tue, 22 Nov 2011 18:40:33 -0800 Subject: [PATCH] Example contributed by Ross Anderson. --- examples/sub_threads.lua | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 examples/sub_threads.lua diff --git a/examples/sub_threads.lua b/examples/sub_threads.lua new file mode 100644 index 0000000..cfdaf64 --- /dev/null +++ b/examples/sub_threads.lua @@ -0,0 +1,53 @@ +-- Copyright (c) 2011 by Ross Anderson +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. + +local llthreads = require"llthreads" + +--- level 0 string literal enclosure [[ ]] +local thread_code = [[ + print("CHILD: received params:", ...) + local llthreads = require"llthreads" -- need to re-declare under this scope + local t = {} -- thread storage table + -- create a new child thread - with level 1 literal string [=[ ]=] enclosures, level 2 would be [==[ ]==] + local executed_child_code = [=[ + return 'Hello from child sub-thread, new input params:', ... + ]=] + -- first child sub-thread + local thread1 = llthreads.new(executed_child_code , "number:", 1001, "nil:", nil, "bool:", true) + assert(thread1:start()) -- start new child sub-thread + table.insert(t, 1, thread1) -- insert thread into thread table + -- second child sub-thread + local thread2 = llthreads.new(executed_child_code , "number:", 1002, "nil:", nil, "bool:", true) + assert(thread2:start()) -- start new child sub-thread + table.insert(t, 1, thread2) -- insert thread into thread table + -- wait for all child sub-threads to complete before returning to root + while true do + print("PARENT: child returned: ", t[1]:join()) + table.remove(t,1) + if (#t <= 0) then break end + end + return ... -- return the parents' input params back to the root +]] + +-- create child thread. +local thread = llthreads.new(thread_code, "number:", 1234, "nil:", nil, "bool:", true) +-- start joinable child thread. +assert(thread:start()) +print("Root: child returned: ", thread:join())