pEnd_ является членом объекта и может увеличиваться только в add(), как показано ниже в одном потоке, его можно прочитать другим потоком. Нужно ли нам __sync_synchronize в add()?Здесь необходим барьер памяти * * pEnd_ = v; __sync_synchronize(); ++ pEnd_; "?
struct Vector {
...
void add(int v) {
*pEnd_ = v;
__sync_synchronize(); // is this needed?
++pEnd_;
}
private:
int* pBegin_;
int* pEnd_;
}
итерация в другой теме.
for (p = pBegin_; p != pEnd_; ++p) {
// read barrier here may be inserted
if (*p) {
....
}
}
По барьерам вы имеете в виду «мьютекс»? или "sync_synchronize"? – ChronoTrigger
sync_synchronize – poordeveloper
У вас есть условие гонки, если несколько потоков выполняют '++ pEnd_' в одно и то же время. – ChronoTrigger