I'm a bit of an Erlang newbie so the gurus may come up with something much better than this, but I can think of these possible approaches:<br><ol><li>Create a gen_fsm that controls all the collections. The collections could be ETS tables or gen_servers wrapping ETS tables. Under normal use, messages are sent to the fsm to update the collections individually. When the time comes to require consistency across the collections, send a message to the fsm to get the collective state data. The fsm goes into a different state while it gathers the data. This state would reject requests to update the collections (or wait until the state changes), although reads would still be allowed. On getting the result, the state changes back to allow updates again.</li>
<li>Create a memory-only Mnesia table for each collection, and use Mnesia transactions to get the multiple values atomically.</li><li>Change the architecture of the current lock-oriented program to make better use of Erlang's features.<br>
</li></ol>Hope this helps.<br><br><div class="gmail_quote">2008/6/29 Mike T <<a href="mailto:talmage.news@gmail.com">talmage.news@gmail.com</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello,<br>
<br>
I was not sure where best to post this and hope someone is able to<br>
help with this question.<br>
<br>
After being bitten by the pitfalls of lock-oriented multi threading I<br>
am interested in switching to message passing oriented concurrency.<br>
<br>
I have read that erlang has a per-process ordering guarantee (that is<br>
if A sends messages 1 and 2 to B 1 will arrive before 2 at B. However,<br>
there is no guarantee that messages from C and D will not be placed in<br>
between 1 and 2.<br>
<br>
So my question is this:<br>
In my current lock oriented program design I have threads dedicated to<br>
managing different collections and actions on those collections<br>
(hashmaps), lets call them A, B, C, and D. At several points in the<br>
program one thread needs to get data from the other collections and<br>
make a decision based on the collective state of the values it gathers<br>
form those other collections.<br>
<br>
An example situation would be A needing data from B, C, and D. In that<br>
case A would attempt to lock A, B, C, and D then gather the items it<br>
needs and release the lock.<br>
<br>
How would I accomplish this same task in a message passing manner?<br>
<br>
I had though of doing: A sends a message to B, C, and D asking for the<br>
data. However, B, C, and D may have each changed independently of each<br>
other by the time they receive the request for data and/or by the time<br>
they are able to send the message to A. So, how do you deal with<br>
situations like this in a message passing paradigm?
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br><br clear="all"><br>-- <br>The great enemy of the truth is very often not the lie -- deliberate, contrived and dishonest, but the myth, persistent, persuasive, and unrealistic. Belief in myths allows the comfort of opinion without the discomfort of thought.<br>
John F. Kennedy 35th president of US 1961-1963 (1917 - 1963)