У меня есть станд.:: вектор <...>, который совместно используется в двух потоках.
Они оба выполняют вызовы к vec-> размер ();
Это может быть источником условий состязания? Я надеюсь не с тех пор vec->, размер () является константой.
Спасибо!
Если вы звоните ТОЛЬКО на vec-> size ()
, вы в безопасности. Но в это как-то сложно поверить. Как только вы вызываете любой метод изменения, такой как push_back
, гонка может привести к получению неправильного размера.
Наверное, нет. Проблема не в vec-> size (), а во всех других функциях.
Учтите следующее: vector :: size () обычно вычисляется непосредственно из членов, например .end
- .begin
. Что теперь происходит с push_back в одном потоке? На размер это влияет, очевидно, через члены. Это меняет память. Но барьера памяти нет. Другие потоки на других ядрах просто увидят старую память. В результате, когда они вызывают size ()
, он будет рассчитан с использованием старых значений.
Очевидное исключение - когда вектор не меняет размер после создания потоков. В обсуждениях никогда не будет устаревшей информации.