This library provides the Concurrent Haskell extensions as described in . module Concurrent where data ThreadId -- thread identifiers instance Eq ThreadId instance Ord ThreadId forkIO :: IO () -> IO ThreadId myThreadId :: IO ThreadId killThread :: ThreadId -> IO () yield :: IO () data MVar a -- Synchronisation variables newEmptyMVar :: IO (MVar a) newMVar :: a -> IO (MVar a) takeMVar :: MVar a -> IO a putMVar :: MVar a -> a -> IO () swapMVar :: MVar a -> a -> IO a readMVar :: MVar a -> IO a isEmptyMVar :: MVar a -> IO Bool instance Eq (MVar a) data Chan a -- channels newChan :: IO (Chan a) writeChan :: Chan a -> a -> IO () readChan :: Chan a -> IO a dupChan :: Chan a -> IO (Chan a) unReadChan :: Chan a -> a -> IO () isEmptyChan :: Chan a -> IO Bool getChanContents :: Chan a -> IO [a] writeList2Chan :: Chan a -> [a] -> IO () data CVar a -- one element channels newCVar :: IO (CVar a) putCVar :: CVar a -> a -> IO () getCVar :: CVar a -> IO a data QSem -- General/quantity semaphores newQSem :: Int -> IO QSem waitQSem :: QSem -> IO () signalQSem :: QSem -> IO () data QSemN -- General/quantity semaphores newQSemN :: Int -> IO QSemN waitQSemN :: QSemN -> Int -> IO () signalQSemN :: QSemN -> Int -> IO () type SampleVar a -- Sample variables newEmptySampleVar:: IO (SampleVar a) newSampleVar :: a -> IO (SampleVar a) emptySampleVar :: SampleVar a -> IO () readSampleVar :: SampleVar a -> IO a writeSampleVar :: SampleVar a -> a -> IO () Notes: GHC uses preemptive multitasking: Context switches can occur at any time, except if you call a C function (like main = forkIO (write 'a') >> write 'b' where write c = putChar c >> write c will print either The yield action forces a context-switch to any other currently runnable threads (if any), and is occasionally useful when implementing concurrency abstractions (especially so if the implementation of Concurrent Haskell uses cooperative multitasking). Hugs does not provide the functions Thread identities and The The operation