我正在Linux中使用c / c ++开发一些程序。我的问题是:
我的问题是:我如何保护这个“Vault”的大结构?我实际上可以保护地图或列表,但我不知道如何同时保护它们。
有人给我一些想法吗?
答案 0 :(得分:1)
添加互斥锁并锁定它,然后再访问其中任何一个。
将它们设为私有,因此您知道通过您的成员函数(具有正确的锁定)进行访问
考虑使用std :: shared_ptr而不是Order *
答案 1 :(得分:1)
我不认为我曾见过订单簿的多线程使用。我真的认为你最好只在一个线程中使用它。
但是,为了回到你的问题,我会假设你出于任何原因继续使用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(¢ralVault, old_ptr, new_ptr) );
cachedVault = old_ptr;