| ▲ | adwn 9 hours ago | ||||||||||||||||
> avoid the use of mutex […] It turns out it is always possible How would you handle the archetypical example of a money transfer between two bank accounts, in which 100 units of money need to be subtracted from one account and atomically added to another account, after checking that the first account contains at least 100 units? | |||||||||||||||||
| ▲ | vrmiguel an hour ago | parent | next [-] | ||||||||||||||||
Since the thread mentions Rust: in Rust, you often replace Mutexes with channels. In your case, you could have a channel where the Receiver is the only part of the code that transfers anything. It'd receive a message Transfer { from: Account, to: Account, amount: Amount } and do the required work. Any other threads would therefore only have copies of the Sender handle. Concurrent sends would be serialized through the queue's buffering. I'm not suggesting this is an ideal way of doing it | |||||||||||||||||
| ▲ | galangalalgol 8 hours ago | parent | prev [-] | ||||||||||||||||
The simplest pure functional way would be to copy the whole database instantiating a new copy with the desired change if the condition was met. That obviously doesn't scale, which is where the performance thing comes in. A still pure way would be to use a persistent tree or hash mapped trie that allows efficient reuse of the original db. There are times a purely functional approach doesn't perform well enough, but even with large scale entity component type systems in both rust and c++, the number of times I've had to use a mutex to be performant is small. Atomic is much more common, but still not common. Persistent data structures alleviate most of the need. | |||||||||||||||||
| |||||||||||||||||