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

·>Здравствуйте, VVV, Вы писали:


VVV>>size() имеется в виду функция типа size_t size() { return m_size; }

·>Т.е. завязываешься на конкретную реализацию конкретного контейнера...

Товарищ! Это _ПСЕВДОКОД_, иллюстрирующий идею. Нет тут никаких конкретных реализаций. Это может быть size(), isChanged(), hasNewItems() и т.д. — это просто ИДЕЯ!

·>... но всё равно без разницы. Чтение переменной из одного потока, когда она меняется из другого просто так, без всяких многопоточных штуковин — вещь как повезёт. Например, значение 0 может закешироваться в регистре одного потока и из памяти никогда не читаться и изменения в памяти другим потоком не будут видны. Как мининмум нужен membar.

·>Приведённый ранее код — ошибочен. Если ты так делаешь в реальном коде — обязательно исправь, это бага.

Есть волшебное слово volatile — оно спасёт. И не будь столь категоричным. Приведи пример, КАК такой код может сработать неправильно?

VVV>>Ещё алгоритм придумался: использовать кольцевой буфер новых/удаляемых объектов. insert/erase двигают tail, doSome двигает head.

·>Да, такое вроде сработает, но только если doSome выполняется из максимум одного потока.

ну это ТС пусть смотрит, подходит ему или нет. Судя по этому куску кода — это похоже на код игры, где doSome — в UI потоке, а insert/erase в потоке gameEngine.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.