是否有来自知名来源的以下设计模式(我不确定它叫什么)的其他文档/讨论?我几乎100%确定以下内容将在两个(不超过两个)进程之间安全地管理数据,但如果我能从信誉良好的来源找到有关其工作原理的更详细信息,我会感觉好多了。
假设我有两个并行执行的进程A和B.它们共享以下数据结构(伪C代码):
struct Shared
{
bool ownedByA
Otherstuff otherstuff;
}
我可以使用以下一对状态机安全地管理这些共享数据:
A:
state A.A (data is owned by A), entered on startup:
read/modify/write "otherstuff"
when done, goto A.Adone
state A.Adone
set ownedByA to false
goto state A.B
state A.B (data is owned by B):
if ownedByA is true, goto state A.A
otherwise stay in state A.B
B:
state B.A (data is owned by A), entered on startup:
if ownedByA is false, goto state B.B
otherwise stay in state B.A
state B.B (data is owned by B):
read/modify/write "otherstuff"
when done, go to B.Bdone
state B.Bdone:
set ownedByA to true
goto state B.A
我们必须确保A.A写入“otherstuff”并且A.Adone对ownByA的写入是严格的顺序排序w / r / t内存可见性。同样适用于B.B和B.Bdone。
启动时:
1. Initialize ownedByA to true, A to the A.A state, B to the B.A state
2. start running state machines
(ensure that 1. happens-before 2.)
答案 0 :(得分:1)
也许这只是一个餐饮哲学家的问题,只有两个哲学家和一个分支。
答案 1 :(得分:1)
您可以尝试Th. J. Dekker's solution,由E. W. Dijkstra在EWD1303 paper中提及。
然后发生了深刻而可爱的事情。通过分析什么 论证结构可以满足证明义务 数学数学家Th.J. Dekker在几个小时内完成设计 上面的解决方案连同它的正确性论证,这就解决了 大赛。
在上述解决方案中,对“c1,c2”实现了相互 排除,而“转”已被引入解决领带时 两个进程同时尝试进入其关键部分。