私は持ってい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
}
}
すべての Customer も更新され、いくつかの計算が含まれます。これは簡単な Observer パターンです。しかし、多数のオブザーバーと各オブザーバーでの膨大な計算は、この設計のキラーです。コードでロックの競合が発生します。これは実際的な問題だと思いますが、人々はよりスマートな方法を使用しており、私はそれらのよりスマートな方法を探しています。今回は少し分かりやすいと思います
ありがとうシブ