MState offers a State monad which can be used in concurrent applications. It also manages new threads and waits until the whole state monad has been evaluated/executed before it returns the state values (if desired).