关于使用无锁共享内存标志的两个协作进程的文献/文档

时间:2010-01-14 13:32:51

标签: design-patterns concurrency

是否有来自知名来源的以下设计模式(我不确定它叫什么)的其他文档/讨论?我几乎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.)

2 个答案:

答案 0 :(得分:1)

也许这只是一个餐饮哲学家的问题,只有两个哲学家和一个分支。

http://en.wikipedia.org/wiki/Dining_philosophers_problem

答案 1 :(得分:1)

您可以尝试Th. J. Dekker's solution,由E. W. Dijkstra在EWD1303 paper中提及。 alt text

  

然后发生了深刻而可爱的事情。通过分析什么   论证结构可以满足证明义务   数学数学家Th.J. Dekker在几个小时内完成设计   上面的解决方案连同它的正确性论证,这就解决了   大赛。
  在上述解决方案中,对“c1,c2”实现了相互   排除,而“转”已被引入解决领带时   两个进程同时尝试进入其关键部分。