gpt4 book ai didi

c++ - 在 ZeroMQ 中实现无锁多线程应用

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:40 25 4
gpt4 key购买 nike

http://www.zeromq.org/blog:multithreading-magic

基于消息的ZeroMQ框架在不使用锁的情况下实现并发/多线程应用。

问题> 下面这个例子是如何工作的?

例如:

我们有两个客户端,每个客户端都从同一个数据库读取数据,然后返回修改后的结果。

ClientA: Read data A, modified A.value = A.value + 1 then write data A back to database
ClientB: Read data A, modified A.value = A.value + 2 then write data A back to database

问题> 我不知道如何用 ZeroMQ 实现这样一个系统,所以我不需要锁来控制 ClientA 和 ClientB 的行为。如何防止以下情况发生的情况。

ClientA read data A first
ClientB read data A second
ClientB write data A back // now data.value has been increased by two
ClientA write data A back // now the conflict! because the original value of A has been
// modified by ClientB and ClientA has no information about it.
// If ClientA writes the A back without knowing the update A
// then the changes made by ClientB will be voided.

ZeroMq 如何在不使用锁的情况下通过其消息解决此类问题?

谢谢

最佳答案

一个简单的答案是您可以使用并发队列模拟锁。

假设您有一个大小为 1 的队列已满。客户端将尝试从队列中获取一个值。成功的将执行该操作并将一个值放回队列中。失败的客户端会进入休眠状态,并在成功的客户端完成后继续。

这可以说是一个学术例子。实际上,您可能会在数据库系统中使用事务而不是在客户端之间使用锁。

关于c++ - 在 ZeroMQ 中实现无锁多线程应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com