На MacOSX, используя g ++, безопасен ли поток std :: vector .size ()? - PullRequest
5 голосов
/ 04 марта 2010

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

Они оба вызывают vec-> size ();

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

Спасибо!

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

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

1 голос
/ 04 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...