LInux / c ++,如何同时保护两个数据结构?
我正在Linux中用c / c ++开发一些程序。 我的问题是:
我的问题是:我怎样才能保护这个“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(¢ralVault, 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?