Multithreading 通过克隆数据结构并发读写器?

Multithreading 通过克隆数据结构并发读写器?,multithreading,concurrency,locking,distributed,lock-free,Multithreading,Concurrency,Locking,Distributed,Lock Free,我读了这个问题,但它并没有真正的帮助 首先也是最重要的一点:时间性能是我正在开发的应用程序的重点 我们有一个客户机/服务器模型(如果我们愿意,甚至是分布式的或云计算的)和一个托管在服务器上的数据结构D。每个客户端请求包括: 从D 最终在D 最终删除D 我们可以说,在这个应用程序中,接收到的操作数之间的关系可以描述为delete您使用的方案有效。我看不出有什么特别的问题。这与许多数据库运行HA解决方案基本相同。它们将写入日志应用于副本。该模型在副本的形成、访问和维护方面提供了很大的灵活性。故障切换

我读了这个问题,但它并没有真正的帮助

首先也是最重要的一点:时间性能是我正在开发的应用程序的重点

我们有一个客户机/服务器模型(如果我们愿意,甚至是分布式的或云计算的)和一个托管在服务器上的数据结构
D
。每个客户端请求包括:

  • D
  • 最终在
    D
  • 最终删除
    D

  • 我们可以说,在这个应用程序中,接收到的操作数之间的关系可以描述为
    delete您使用的方案有效。我看不出有什么特别的问题。这与许多数据库运行HA解决方案基本相同。它们将写入日志应用于副本。该模型在副本的形成、访问和维护方面提供了很大的灵活性。故障切换也很容易

    另一种技术是使用持久数据结构。每次写入都会返回新的独立数据版本。所有版本都可以以稳定且无锁的方式读取。版本可以随意保留或丢弃。版本共享尽可能多的底层状态

    通常,树是这种持久数据结构的基础,因为很容易更新树的一小部分并重用大部分旧树

    您可能没有找到更复杂的方法的一个原因是,您的问题非常普遍:您希望此方法适用于任何数据结构,并且数据可能很大

    SQLServerHekaton使用非常复杂的数据结构来实现任何数据库内容的无锁、可读的时间点快照。也许值得一看他们是如何做到这一点的(他们发表了一篇论文,描述了系统的每一个细节)。它们还允许ACID事务、序列化和并发写入。全部开锁

    同时,f将s更新的Ds复制到其Df中

    由于数据量大,此副本需要很长时间。它将阻止读者。更好的方法是在接受新写入之前,将写入日志应用于可写副本。这样,阅读就可以被不断地接受


    切换时间也很短,读取的延迟可能比正常情况稍高。

    首先,感谢您的回答:)关于复制问题,您是对的,但我已经想到了另一种解决方案:
    f
    在交换之前在磁盘上复制
    Ds
    。交换发生后,
    f
    从磁盘
    Ds
    加载到
    Df
    。除非此过程未完成,否则
    f
    无法执行任何写入/删除操作,但这不是问题:复制过程完成后,这些操作将被缓冲并按顺序应用。是的,暂停写入会留下一个最近的可读副本。行得通。我想知道你愿意暂停写多久。如果数据太大,需要两台服务器,那么就必须通过慢速网络复制大量数据。100GB/s时的100GB是20分钟的暂停。听起来是灾难性的。