Re[6]: у него много обращений на чтение, и очень очень редко на запись
От: VVV Россия  
Дата: 09.08.18 15:10
Оценка:
Здравствуйте, ksd, Вы писали:

ksd>++ "у него" в контейнере ~10 элементов, но много обращений на чтение:

ksd>
ksd>    struct Subsc_t {
ksd>        virtual void doSome() = 0;
ksd>    };

ksd>    set<Subsc_t*> subscribers;

ksd>    for (auto s: subscribers) {
        s->>doSome();
ksd>    }
ksd>

ksd>и с очень маленькой вероятностью в миллионы раз реже может быть из другого треда subscribers.insert(some) или erase;
ksd>завернуть for в критическую секцию не вариант.

Сделать потокобезопасно в данном случае можно, если insert/erase делать в этом же потоке, где и обработка. Примерно так: завести ещё 2 контайнера insertedItems/erasedItems и критикал секшин на доступ к этим контейнерам.

псевдокод:
insert(some)
{
  cs.lock()
  insertedItems.insert(some)
  cs.unlock()
}
erase(some)
{
  cs.lock()
  erasedItems.insert(some)
  cs.unlock()
}

doSome()
{
  for(){...}
  if(insertedItems.size()+erasedItems.size() > 0)
  {
     cs.lock();
     //insert or erase to/from subscribers
     cs.unlock();
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.