1

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

ありがとうシブ

4

1 に答える 1