Hello Bulat,

Tuesday, April 7, 2009, 6:50:14 PM, you wrote:

>   tid <- forkIO (executing commands from chan...)
>   waitQSem sem
>   killThread tid

> instead of killThread we really should send pseudo-job (like my
> Nothing value) that will led to self-killing of job that gets this
> signal

> this solution still may lead to a bit more or less than N threads
> executed at the same time. your turn!

solved! every job should go together with Bool flag `killItself`.
last job should have this flag set to True. thread will execute job
and kill itself if this flag is True. so we get strong guarantees that
there are exactly N threads in the system:

para xs = do
  sem <- newQSem
  for (init xs) $ \x -> do
    writeChan chan (x `finally` signalQSem sem, False)
  writeChan chan (last x `finally` signalQSem sem, True)
  --
  tid <- forkIO $ do
           let cycle = do
             (x,flag) <- readChan chan
             x
             unless flag cycle
           cycle
  --
  waitQSem sem


btw, this problem looks a great contribution into "Haskell way"
book of exercises

-- 
Best regards,
 Bulat                            mailto:bulat.zigans...@gmail.com

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to