2017-06-02 69 views
2

以下是方案。鲍勃是一位作家,爱丽丝是一位读者。鲍勃写东西,艾丽斯读它们。规则是:虚拟锁机制:非阻塞写入,读取和无效

1)Bob可以写出Alice是否正在读取(读取不阻止写入)。

2)当鲍勃写信时,艾丽斯无法读取(写入块读取)。 3)当Alice完成阅读时,她可以知道Bob在她的阅读过程中是否写过(读者可以检测到他们刚才阅读的数据是否无效)。

2)和3)实际上是一个组合规则,但我列出了两个好的讨论。这个问题可以通过一个互斥体和一个计数器(版本号)来解决,但我不知道的是,上面是一个常用名称的公知方案?有没有对此做过研究?

+0

可能是你谈论交易吗? 1.收集数据2.锁定互斥锁3.存储4.解锁 – user5821508

+3

关于1)和2):当爱丽丝正在阅读和鲍勃想写什么? 1)和2)在这种情况下似乎是矛盾的 – bolov

+0

@ user5821508对于Bob,它是无锁的。直接存储数据。 – mzer0

回答

3

我不知道的是,这个问题是一个以术语命名的公知方案吗?

是的,它被称为顺序锁: https://en.wikipedia.org/wiki/Seqlock

它有没有人研究或我只是做一个轮子?

AFAIK有各种实现(如Linux内核)和论文。

+1

写入不会(技术上)阻止读取。它只是使它们无效,并使用序列号,以便读者可以知道他们是否读取了现在无效的数据。在C++中,它会稍微注意(我建议)原子,内存顺序和内存隔离,以实现这一点。特别是作者在获取锁定之后并在释放之前更新序列号。为确保所需的排序,这些操作需要通过互斥之外的其他命令来排序。 对于单个值原子可能是一个更简单/更快/更可预测的选项。 – Persixty