LInux / c ++,如何同时保护两个数据结构?

我正在Linux中用c / c ++开发一些程序。 我的问题是:

  • 我有一个名为Vault的上层类,里面有一个OrderMap,它使用unordered_map作为数据结构,一个OrderBook,其中有两个std :: list。
  • OrderMap和OrderBook都存储Order *作为元素,它们共享一个Order对象,该对象在堆上分配。 所以无论是OrderBook还是OrderMap都会修改其中的顺序。
  • 我有两个线程会对它们执行读写操作。 2个线程可以插入/修改/检索(读取)/删除元素。
  • 我的问题是:我怎样才能保护这个“Vault”的大结构? 我实际上可以保护地图或列表,但我不知道如何同时保护它们。

    有人给我一些想法?


    在访问任何一个之前添加一个互斥锁并锁定它。

    使它们成为私人的,所以你知道访问是通过你的成员函数(它有适当的锁)

    考虑使用std :: shared_ptr而不是Order *


    我不认为我见过订单簿的多线程用法。 我真的认为你最好只在一个线程中使用它。

    但是,为了回到你的问题,我会假设你无论出于什么原因都会使用2个线程。
    这种数据结构太复杂,无法锁定。 所以这些是我可以看到的多线程选项:
    1.如果您为两个线程使用单个 Vault实例,则必须锁定它。 我假设你不在乎烧一些cpu时间,所以我强烈建议你使用自旋锁,而不是互斥锁。
    2.如果您可以允许拥有2个Vault实例,这可以改善事情,因为每个线程都可以保留它自己的私有实例,并使用其他方式与其他线程交换修改:无锁队列或其他方法。
    3.如果您的图书足够快可以复制,您可以拥有一个中央Vault指针,在每个更新或一组更新上复制CAS到该中央指针上,并重新使用旧指针而不必每次分配时间。 每个线程最终会有一个备用实例。 喜欢这个:

    Vault* old_ptr = centralVault;
    Vault* new_ptr = cachedVault ? cachedVault : new Vault;
    do {
        *new_ptr = *old_ptr;
        makeChanges(new_ptr);
    }
    while( !cas(&centralVault, old_ptr, new_ptr) );
    cachedVault = old_ptr;
    
    链接地址: http://www.djcxy.com/p/87907.html

    上一篇: LInux/c++, how to protect two data structures at same time?

    下一篇: Storage location of C++ array in memory