Race condition when multiple threads wait for a process
Consider the following code:
import System.Process
import Control.Concurrent.Async
main :: IO ()
main = do
(_, _, _, ph) <- createProcess $ shell "sleep 1"
let helper i = do
ec <- waitForProcess ph
print (i :: Int, ec)
((), ()) <- concurrently (helper 1) (helper 2)
return ()
If I compile with the single threaded runtime, I get the output
(2,ExitSuccess)
(1,ExitSuccess)
But when compiling with the multithreaded runtime, I get:
bin: waitForProcess: does not exist (No child processes)
If you need to wait for a process from multiple threads, you can do so now by having a dedicated wait thread which writes to an MVar or TMVar, but the current default behavior can be surprising.
I discussed this in a blog post, and there was some conversation on Reddit.
At the least, I think we need better documentation, but if there's a better solution, that would be best.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | libraries/process |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |