На MacOSX, с помощью g ++, станд.:: вектор .size () ориентированный на многопотоковое исполнение?

У меня есть станд.:: вектор <...>, который совместно используется в двух потоках.

Они оба выполняют вызовы к vec-> размер ();

Это может быть источником условий состязания? Я надеюсь не с тех пор vec->, размер () является константой.

Спасибо!

5
задан Paul R 4 March 2010 в 09:26
поделиться

2 ответа

Если вы звоните ТОЛЬКО на vec-> size () , вы в безопасности. Но в это как-то сложно поверить. Как только вы вызываете любой метод изменения, такой как push_back , гонка может привести к получению неправильного размера.

5
ответ дан 14 December 2019 в 13:33
поделиться

Наверное, нет. Проблема не в vec-> size (), а во всех других функциях.

Учтите следующее: vector :: size () обычно вычисляется непосредственно из членов, например .end - .begin . Что теперь происходит с push_back в одном потоке? На размер это влияет, очевидно, через члены. Это меняет память. Но барьера памяти нет. Другие потоки на других ядрах просто увидят старую память. В результате, когда они вызывают size () , он будет рассчитан с использованием старых значений.

Очевидное исключение - когда вектор не меняет размер после создания потоков. В обсуждениях никогда не будет устаревшей информации.

1
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: