|>>    - Fetch elimination for imperative reads:
|>>      writeIORef r e >> acts >> readIORef r
|>>  === writeIORef r e >> acts >> return e
|> 
|> This transformation is valid only on single-threaded systems.
|> If there is any possibility of an IORef being shared across threads,
|> you are out of luck.
|
|(assuming 'acts' doesn't modify 'r').

this remark is the problem.

|No, Jan's transformation is correct even in a multithreaded setting.  It
|might eliminate some possible outcomes from a non-deterministic program,
|but that's ok.  There's no requirement that all interleavings according
|to the semantics have to be implemented. ..

not implementing traces promised as possible by the semantics is not 
a good idea, imho, as programmers have some control over the set of 
traces themselves. 

in this case, acts could implement the synchronisation with another 
thread working on r, ie., even if acts does not modify r itself, it might
reliably cause another thread to modify r before acts can end. if such 
synchronisations depend on traces you have eliminated, the code 
would just block (without apparent reason), whereas in this case, r 
will have a value after acts that shouldn't have been possible, due 
to the explicit synchronisation code (again, happy debugging) ..

of course, you could try to infer non-sequential interference with r
resulting from act, but that is what Malcolm pointed out - you have
to take the full semantics into account when doing such transformations
(btw, java originally made a mess of this- hope that has been fixed by now).

cheers,
claus


_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to