Здравствуйте, 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();
}
}