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



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

  1. 我有一个名为Vault的上层类,其中有一个OrderMap使用unordered_map作为数据结构和一个OrderBook,其中有2个std::list。
  2. OrderMap和OrderBook都存储Order*作为元素,它们共享一个在堆上分配的Order对象。因此OrderBook或OrderMap都可以在其中修改订单。
  3. 我有两个线程将对它们进行读写操作。这两个线程可以插入/修改/检索(读取)/删除元素。

我的问题是:我该如何保护这个"拱顶"的大结构?我可以保护地图或列表,但我不知道如何同时保护它们。

有人能给我一些建议吗?

添加互斥锁,并在访问互斥锁之前锁定互斥锁。

将它们设置为私有,这样您就知道访问是通过您的成员函数进行的(这些成员函数具有适当的锁)

考虑使用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;

最新更新