Rendezvous: Difference between revisions
Content added Content deleted
(→{{header|Wren}}: Made a bit more general.) |
m (→{{header|Phix}}: syntax coloured, marked p2js incompatible) |
||
Line 1,316: | Line 1,316: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Phix has no rendezvous mechanism, the following achieves something similar using a simple mutex. |
Phix has no rendezvous mechanism, the following achieves something similar using a simple mutex. |
||
<lang Phix> |
<!--<lang Phix>(notonline)--> |
||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (threads)</span> |
|||
enum NAME,INK |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">print_cs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">init_cs</span><span style="color: #0000FF;">()</span> |
|||
sequence printers = {{"main",5}, |
|||
<span style="color: #008080;">enum</span> <span style="color: #000000;">NAME</span><span style="color: #0000FF;">,</span><span style="color: #000000;">INK</span> |
|||
{"reserve",5}} |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">printers</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"main"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span> |
|||
<span style="color: #0000FF;">{</span><span style="color: #008000;">"reserve"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">}}</span> |
|||
procedure printer(string name, sequence s) |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">printer</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
|||
for i=1 to length(s) do |
|||
<span style="color: #008080;">try</span> |
|||
enter_cs(print_cs) |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
for p=1 to length(printers) do |
|||
<span style="color: #7060A8;">enter_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">print_cs</span><span style="color: #0000FF;">)</span> |
|||
if printers[p][INK]!=0 then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">printers</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
printers[p][INK] -= 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">printers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">p</span><span style="color: #0000FF;">][</span><span style="color: #000000;">INK</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
printf(1,"%s/%s: %s\n",{name,printers[p][NAME],s[i]}) |
|||
<span style="color: #000000;">printers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">p</span><span style="color: #0000FF;">][</span><span style="color: #000000;">INK</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span> |
|||
exit |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s/%s: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span><span style="color: #000000;">printers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">p</span><span style="color: #0000FF;">][</span><span style="color: #000000;">NAME</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]})</span> |
|||
elsif p=length(printers) then |
|||
<span style="color: #008080;">exit</span> |
|||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">printers</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #008080;">throw</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"out of ink"</span><span style="color: #0000FF;">)</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
leave_cs(print_cs) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end for |
|||
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">print_cs</span><span style="color: #0000FF;">)</span> |
|||
exit_thread(0) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
catch e |
|||
<span style="color: #7060A8;">exit_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
printf(1,"exception(%s): %s\n",{name,e[E_USER]}) |
|||
<span style="color: #008080;">catch</span> <span style="color: #000000;">e</span> |
|||
leave_cs(print_cs) |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"exception(%s): %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #004600;">E_USER</span><span style="color: #0000FF;">]})</span> |
|||
exit_thread(1) |
|||
<span style="color: #7060A8;">leave_cs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">print_cs</span><span style="color: #0000FF;">)</span> |
|||
end try |
|||
<span style="color: #7060A8;">exit_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> |
|||
end procedure |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">try</span> |
|||
constant r_printer = routine_id("printer") |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
constant hd = {"Humpty Dumpty sat on a wall.", |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">hd</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Humpty Dumpty sat on a wall."</span><span style="color: #0000FF;">,</span> |
|||
"Humpty Dumpty had a great fall.", |
|||
" |
<span style="color: #008000;">"Humpty Dumpty had a great fall."</span><span style="color: #0000FF;">,</span> |
||
<span style="color: #008000;">"All the king's horses and all the king's men"</span><span style="color: #0000FF;">,</span> |
|||
"Couldn't put Humpty together again."}, |
<span style="color: #008000;">"Couldn't put Humpty together again."</span><span style="color: #0000FF;">},</span> |
||
mg = {"Old Mother Goose", |
|||
<span style="color: #000000;">mg</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Old Mother Goose"</span><span style="color: #0000FF;">,</span> |
|||
"When she wanted to wander,", |
|||
<span style="color: #008000;">"When she wanted to wander,"</span><span style="color: #0000FF;">,</span> |
|||
"Would ride through the air", |
|||
<span style="color: #008000;">"Would ride through the air"</span><span style="color: #0000FF;">,</span> |
|||
"On a very fine gander.", |
|||
<span style="color: #008000;">"On a very fine gander."</span><span style="color: #0000FF;">,</span> |
|||
"Jack's mother came in,", |
|||
<span style="color: #008000;">"Jack's mother came in,"</span><span style="color: #0000FF;">,</span> |
|||
"And caught the goose soon,", |
|||
"And |
<span style="color: #008000;">"And caught the goose soon,"</span><span style="color: #0000FF;">,</span> |
||
<span style="color: #008000;">"And mounting its back,"</span><span style="color: #0000FF;">,</span> |
|||
"Flew up to the moon."} |
|||
<span style="color: #008000;">"Flew up to the moon."</span><span style="color: #0000FF;">}</span> |
|||
sequence hThreads = {create_thread(r_printer,{"hd",hd}), |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">hThreads</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">printer</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"hd"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hd</span><span style="color: #0000FF;">}),</span> |
|||
create_thread(r_printer,{"mg",mg})} |
|||
<span style="color: #7060A8;">create_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">printer</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"mg"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mg</span><span style="color: #0000FF;">})}</span> |
|||
wait_thread(hThreads)</lang> |
|||
<span style="color: #7060A8;">wait_thread</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hThreads</span><span style="color: #0000FF;">)</span> |
|||
<!--</lang>--> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |