我有一个std::map<int, Object*> ObjectMap
. 现在我需要更新地图,更新可以通过多个线程进行。因此,我们锁定地图以进行更新。但是每次更新都会导致冗长的计算,从而导致锁争用。
让我们考虑以下场景。
class Order //Subject
{ double _a, _b,_c;
std::vector<Customer* > _customers;
public:
void notify(int a, int b. int c)
{
//update all customers via for loop. assume a for loop and iterator i
_customers[i] ->updateCustomer(a,b,c)
}
};
class SomeNetworkClass
{
private:
std::map<int, Order*> _orders;
public:
void updateOrder(int orderId, int a, int b, intc)
{
//lock the map
Order* order = _orders[orderId];
order->notify();
//release the lock
}
}
class Customer
{
public:
void updateCustomer(int a,int b, int c)
{
//some lengthy function. just for this example.
//assume printing a, b and c multiple times
}
}
每个客户也会更新,涉及一些计算。现在这是一个微不足道的观察者模式。但是,大量的观察者和每个观察者的巨大计算是这种设计的杀手锏。锁定争用在我的代码中上升。我认为这是一个实际问题,但人们使用更聪明的方法,我正在寻找那些更聪明的方法。我希望这次我有点清楚
谢谢希夫