Can one transaction update two different TVars in an atomic way? i.e. can I compose data structures out of lots of TVars to reduce contention? If so, could you provide an example?
Haskell: Updating two or more TVars atomically. Possible?
1.1k Views Asked by Clinton At
2
There are 2 best solutions below
0
ehird
On
A transaction is completely atomic; if it modifies multiple TVars, both changes will happen together, atomically, in isolation. Anything run in a single atomically block is a single transaction. For example:
swap :: (Num a) => TVar a -> TVar a -> STM ()
swap v1 v2 = do
a <- readTVar v1
b <- readTVar v2
writeTVar v1 b
writeTVar v2 a
Here, swap a b will atomically swap two TVars. The composability of atomic transactions in this way is one of the main benefits of STM.
Related Questions in HASKELL
- Typeclass projections as inheritance
- How to generate all possible matrices given a number n in Haskell
- Is there a way to get `cabal` to detect changes to non-Haskell source files?
- How to have fixed options using Option.Applicative in haskell?
- How can I create a thread in Haskell that will restart if it gets killed due to any reason?
- Automatic Jacobian matrix in Haskell
- Haskell writing to named pipe unexpectedly fails with `openFile: does not exist (No such device or address)`
- Why does Enum require to implement toEnum and fromEnum, if that's not enough for types larger than Int?
- Non-exhaustive patterns in function compress
- How to get terms names of GADT in Template Haskell?
- Implementing eval() function with Happy parser generator
- How to count the occurences of every element in a list in Haskell fast?
- In Haskell, what does `Con Int` mean?
- Extract a Maybe from a heterogeneous collection
- Haskell, Stack, importing module shows error "Module not found"
Related Questions in CONCURRENCY
- Unexpected inter-thread happens-before relationships from relaxed memory ordering
- Multiple Processes, Multiple Processors, Single Priority Queue - Java Thread-Safe and Concurrency -
- Efficiently processing many small elements of a collection concurrently in Java
- Zig Concurrency Vs Erlang Concurrency, is Zig less efficient than Erlang?
- Two Update statements on a row are running simultaneously with no locking in MYSQL
- How to Identify Specific Transaction Anomalies in a Given Schedule?
- How can I improve concurrent message processing with Google Task Queue?
- Why does the following program printf "thread 1 exists" twice in WSL2?
- ModelState.IsValid is false when its Data Model Concurrency Token is non nullable
- .NET A second operation was started on this context instance before a previous operation completed
- Can someone tell me what's wrong with mi Task.await?
- I am a beginner. More than problems, I have ideas I share my code ;D. NO RULES
- Understanding Potential Deadlock in Resource Pool Implementation Described in "Go in Action"
- Why are pre-allocated stacks expensive, given 64-bit virtual memory?
- Concurrency issues with server-sent events in Python
Related Questions in STM
- can't configurate VL53l0x api
- How can I acquire a semaphore and release it from another task in FreeRTOS in STM32H?
- Is retry-using STM action guaranteed interruptible in GHC / Haskell?
- Why 12 bit ADC output of NUCLEO64-STM32L073RZ fluctuate over 20 steps?
- Concurrent Authentication Token Renewal in Haskell
- Touchgfx and NucleoH755 board and Riverdi screen initialization issue with black screen
- Block-STM - Why do we need this condition "when a transaction aborts, all higher transactions are scheduled for re-validation."
- R stm top topics inconsistent for every running
- robustness of estimated effects STM
- Software Transactional Memory in Scala
- Plotting a structural topic model - how to allow for discontinuity over time
- How to add character vector as metadata/docvars to a dfm for stm prevalance
- Reproducible replays of single-threaded write logs using Clojure STM
- Installing Multiverse package for STM development in Java
- Why is a TMVar populated in a function with putTMVar not visible from the calling function?
Related Questions in TVAR
- How to filter one dataframe column values using another dataframe column value?
- R - How to deal with NA values in tvAR (tvReg) - Error: NAs in y
- Impulse response functions for Threshold VAR in R
- Multivariate time series - splitting after one variable for IRF
- TVar constructor? I can't get a TVar
- How to wait until forM_ finishes, when using TVar?
- R: length of 'dimnames' [2] not equal to array extent
- Haskell code littered with TVar operations and functions taking many arguments: code smell?
- Looking at the value of a TVar in GHCi
- Haskell STM shard TVAR
- Type error with the use of transactional memory
- Haskell: TVar: orElse
- Haskell: TVar: Preventing starvation
- Haskell: Updating two or more TVars atomically. Possible?
- Haskell: How does TVar work?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Yes, you can update multiple TVars atomically in one transaction. That's sort of the whole point of STM. It wouldn't be very useful if you couldn't.
Here is a (somewhat silly) example of storing TVars in a data structure. It simulates a bunch of random concurrent transactions between accounts in a bank, where each account is just a
TVar Integer. The account TVars are kept in a map from account IDs, which is itself kept in a TVar so that new accounts can be created on the fly.This should print a total balance of zero at the end if there were no race conditions during the transfers.