У меня есть 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
}
}
Каждый клиент также обновляется с некоторыми задействованными вычислениями. Теперь это тривиальный шаблон Observer. Но с большим количеством наблюдателей и огромным расчетом в каждом наблюдателе это убийственно для этой конструкции. Конфликт за блокировку возникает в моем коде. Я предполагаю, что это практическая проблема, но люди используют более разумные способы, и я ищу эти более разумные способы. Надеюсь, на этот раз я немного ясно выразился
Спасибо Шив
map
.. вы обновляете объект внутри карты.. сама карта не нуждается в блокировке только для этого.. вы можете синхронизировать методupdate()
вместо блокировки карты. , конечно, вам нужно будет заблокировать карту, если один поток читает ее, а другой записывает в нее одновременно. - person Kashyap   schedule 29.02.2012map<id, Order*>
иOrder
имеют указатель наCustomer
, разместившего заказ. Когда порядок изменен, каким-то образомCustomer
необходимо обновить. Таким образом, несколько объектовOrder
могут иметь указатель на один и тот жеCustomer
. - person shiv chawla   schedule 29.02.2012