Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

STM monad problem

This is just a hypothetical scenario to illustrate my question. Suppose that there are two threads and one TVar shared between them. In one thread there is an atomically block that reads the TVar and takes 10s to complete. In another thread is an atomically block that modifies the TVar every second. Will the first atomically block ever complete? Surely it will just keep going back to the beginning, because the log is perpetually in an inconsistent state?

like image 289
Alex Avatar asked Jun 13 '10 10:06

Alex


People also ask

WHAT IS STM in Haskell?

Software Transactional Memory, or STM, is a technique for storing mutable variables in Haskell. Unlike other mutable variables in Haskell, or mutable variables in most languages, it provides transactional capabilities.

What is TVar in Haskell?

TVars. data TVar a # Shared memory locations that support atomic memory transactions.


1 Answers

As others have said: in theory there is no guarantee of progress. In practice there is also no guarantee of progress:

import Control.Monad -- not needed, but cleans some things up
import Control.Monad.STM
import Control.Concurrent.STM
import Control.Concurrent
import GHC.Conc
import System.IO

main = do
    tv <- newTVarIO 0
    forkIO (f tv)
    g tv

f :: TVar Int -> IO ()
f tv = forever $ do
    atomically $ do
            n <- readTVar tv
            writeTVar tv (n + 1)
            unsafeIOToSTM (threadDelay 100000)
    putStr "."
    hFlush stdout

g :: TVar Int -> IO ()
g tv = forever $ do
    atomically $ do
            n <- readTVar tv
            writeTVar tv (n + 1)
            unsafeIOToSTM (threadDelay 1000000)
    putStrLn "Done with long STM"

The above never says "Done with long STM" in my tests.

Obviously if you think the computation is still going to be valid/pertinent then you would want to either

  1. Leave the atomic block, perform expensive computation, enter the atomic block / confirm assumptions are valid / and update the value. Potentially dangerous, but no more so than most locking strategies.
  2. Memoize the results in the atomic block so the still valid result will be no more than a cheap lookup after a retry.
like image 99
Thomas M. DuBuisson Avatar answered Sep 22 '22 02:09

Thomas M. DuBuisson