aboutsummaryrefslogtreecommitdiff
path: root/test/test_threads.lua
diff options
context:
space:
mode:
authormoteus <mimir@newmail.ru>2013-12-26 12:00:41 +0400
committermoteus <mimir@newmail.ru>2013-12-26 12:00:41 +0400
commitfebf9da1af8ba4cf0f8cc64b6af2adb0dcf9b354 (patch)
tree735ef634f8ebeab2101aa21897fd4e4e2f826f32 /test/test_threads.lua
parent46ed59584e5407c49a02f1ea6bede6487259a92e (diff)
downloadlua-llthreads2-febf9da1af8ba4cf0f8cc64b6af2adb0dcf9b354.tar.gz
lua-llthreads2-febf9da1af8ba4cf0f8cc64b6af2adb0dcf9b354.tar.bz2
lua-llthreads2-febf9da1af8ba4cf0f8cc64b6af2adb0dcf9b354.zip
First commit.
Diffstat (limited to 'test/test_threads.lua')
-rw-r--r--test/test_threads.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/test_threads.lua b/test/test_threads.lua
new file mode 100644
index 0000000..467526e
--- /dev/null
+++ b/test/test_threads.lua
@@ -0,0 +1,74 @@
1-- Copyright (c) 2011 by Ross Anderson <ross_j_anderson@yahoo.com>
2--
3-- Permission is hereby granted, free of charge, to any person obtaining a copy
4-- of this software and associated documentation files (the "Software"), to deal
5-- in the Software without restriction, including without limitation the rights
6-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7-- copies of the Software, and to permit persons to whom the Software is
8-- furnished to do so, subject to the following conditions:
9--
10-- The above copyright notice and this permission notice shall be included in
11-- all copies or substantial portions of the Software.
12--
13-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19-- THE SOFTWARE.
20
21-- Sub-thread processing example in Lua using llthreads - 1,000 quick sub-thread execution
22
23-- luajit sub_threads.lua
24
25local llthreads = require"llthreads"
26
27local num_threads = tonumber(arg[1] or 1000)
28
29-- level 0 string literal enclosure [[ ]] of child execution code
30local thread_code = [[
31 local lua_init = os.getenv("lua_init")
32 if lua_init and #lua_init > 0 then
33 if lua_init:sub(1,1) == '@' then
34 dofile(lua_init:sub(2))
35 else
36 assert((loadstring or load)(lua_init))()
37 end
38 end
39
40 local num_threads = ...
41 print("CHILD: received from ROOT params:", ...)
42 local llthreads = require"llthreads" -- need to re-declare this under this scope
43 local t = {} -- thread storage table
44
45 -- create a new child sub-thread execution code - it requires level 1 literal string [=[ ]=] enclosures, level 2 would be [==[ ]==]
46 local executed_child_code = [=[
47 return "Hello from child sub-thread, new input params:", ...
48 ]=]
49
50 -- create 1000 sub-threads - which creates an incremental 30% / 20% utilization spike on the two AMD cpu cores
51 print("CHILD: Create sub threads:", num_threads)
52 for i=1,num_threads do
53 -- create child sub-thread with code to execute and the input parmeters
54 local thread = llthreads.new(executed_child_code , "number:", 1000 + i, "nil:", nil, "bool:", true)
55 assert(thread:start()) -- start new child sub-thread
56 table.insert(t, thread) -- append the thread at the end of the thread table
57 end
58
59 -- wait (block) for all child sub-threads to complete before returning to ROOT
60 while true do
61 -- always wait on the first element, since order is not important
62 print("CHILD: sub-thread returned: ", t[1]:join())
63 table.remove(t,1) -- always remove the first element
64 if (#t == 0) then break end
65 end
66 return ... -- return the parents' input params back to the root
67]]
68
69-- create child thread.
70local thread = llthreads.new(thread_code, num_threads, "number:", 1000, "nil:", nil, "bool:", true)
71-- start joinable child thread.
72assert(thread:start())
73-- wait for all child and child sub-threads to finish
74print("ROOT: child returned: ", thread:join())