Здравствуйте, VVV, Вы писали:
VVV>·>... но всё равно без разницы. Чтение переменной из одного потока, когда она меняется из другого просто так, без всяких многопоточных штуковин — вещь как повезёт. Например, значение 0 может закешироваться в регистре одного потока и из памяти никогда не читаться и изменения в памяти другим потоком не будут видны. Как мининмум нужен membar.
VVV>·>Приведённый ранее код — ошибочен. Если ты так делаешь в реальном коде — обязательно исправь, это бага.
VVV>Есть волшебное слово volatile — оно спасёт. И не будь столь категоричным. Приведи пример, КАК такой код может сработать неправильно?
Да, если сделать отдельную volatile переменную рядышком с контейнером, то всё в порядке. Просто со стандартными контейнерами не прокатит, там m_size не volatile.
VVV>>>Ещё алгоритм придумался: использовать кольцевой буфер новых/удаляемых объектов. insert/erase двигают tail, doSome двигает head.
VVV>·>Да, такое вроде сработает, но только если doSome выполняется из максимум одного потока.
VVV>ну это ТС пусть смотрит, подходит ему или нет. Судя по этому куску кода — это похоже на код игры, где doSome — в UI потоке, а insert/erase в потоке gameEngine.
Каждый своё увидел.
Я увидел что insert/erase это подключение/оключение клиентов, а doSome используется из критических потоков для быстрой раздачи большого количества данных клиентам.