Content deleted Content added
King Lopez (talk | contribs) ←Undid revision 112785816 by 203.82.48.172 (talk) |
|||
Line 72:
}
}
=== [[Visual Prolog]] ===
This is an realistic example of protecting the operations on a stream with a named mutex.
First the outputStream interface (a simplified version of the real one):
<font color="#808000">interface</font> outputStream
<font color="#808000">predicates</font>
write : <font color="#993300">(</font>...<font color="#993300">)</font>.
writef : <font color="#993300">(</font>string <font color="#008000">FormatString</font>, ...<font color="#993300">)</font>.
<font color="#808000">end</font> <font color="#808000">interface</font> outputStream
This class encapsulates each of the stream operations the mutex. The '''finally''' predicate is used to ensure that the mutex is released no matter how the operation goes (i.e. also in case of excetions). The underlying mutex object is released by a ''finalizer'' in the mutex class, and for this example we leave it at that.
<font color="#808000">class</font> outputStream_protected : outputStream
<font color="#808000">constructors</font>
new : <font color="#993300">(</font>string <font color="#008000">MutexName</font>, outputStream <font color="#008000">Stream</font><font color="#993300">)</font>.
<font color="#808000">end</font> <font color="#808000">class</font> outputStream_protected
<font color="#800080">#include</font> <font color="#0000FF">@"pfc\multiThread\multiThread.ph"</font>
<font color="#808000">implement</font> outputStream_protected
<font color="#808000">facts</font>
mutex : mutex.
stream : outputStream.
<font color="#808000">clauses</font>
new<font color="#993300">(</font><font color="#008000">MutexName</font>, <font color="#008000">Stream</font><font color="#993300">)</font> :-
mutex := mutex::createNamed<font color="#993300">(</font><font color="#008000">MutexName</font>, false<font color="#993300">)</font>, <font color="#AA77BD">% do not take ownership</font>
stream := <font color="#008000">Stream</font>.
<font color="#808000">clauses</font>
write<font color="#993300">(</font>...<font color="#993300">)</font> :-
_ = mutex:wait<font color="#993300">()</font>, <font color="#AA77BD">% ignore wait code in this simplified example</font>
<font color="#333399">finally</font><font color="#993300">(</font>stream:write<font color="#993300">(</font>...<font color="#993300">)</font>, mutex:release<font color="#993300">())</font>.
<font color="#808000">clauses</font>
writef<font color="#993300">(</font><font color="#008000">FormatString</font>, ...<font color="#993300">)</font> :-
_ = mutex:wait<font color="#993300">()</font>, <font color="#AA77BD">% ignore wait code in this simplified example</font>
<font color="#333399">finally</font><font color="#993300">(</font>stream:writef<font color="#993300">(</font><font color="#008000">FormatString</font>, ...<font color="#993300">)</font>, mutex:release<font color="#993300">())</font>.
<font color="#808000">end</font> <font color="#808000">implement</font> outputStream_protected
'''Usage example'''.
The '''client''' uses an '''outputStream'''. Instead of receiving the '''pipeStream''' directly, it gets the protected version of it.
<font color="#800080">#include</font> <font color="#0000FF">@"pfc\pipe\pipe.ph"</font>
<font color="#808000">goal</font>
<font color="#008000">Stream</font> = pipeStream::openClient<font color="#993300">(</font><font color="#0000FF">"TestPipe"</font><font color="#993300">)</font>,
<font color="#008000">Protected</font> = outputStream_protected::new<font color="#993300">(</font><font color="#0000FF">"PipeMutex"</font>, <font color="#008000">Stream</font><font color="#993300">)</font>,
client<font color="#993300">(</font><font color="#008000">Protected</font><font color="#993300">)</font>,
<font color="#008000">Stream</font>:close<font color="#993300">()</font>.
==See also==
|