C ++ в std :: vector и безопасность потоков - PullRequest
1 голос
/ 17 марта 2012

Является ли следующий код потокобезопасным:

РЕЗЬБА

  std::vector<std::string> myCopy;
  with_locked_mutex(m) {
    myCopy = sharedCopy;
  }
  myCopy.clear() etc.  // -- a

РЕЗЬБА B

  while(1) {
    // do things ...
    with_locked_mutex(m) {
      sharedCopy.push_back(a); // -- b
    }
  }

Другими словами, будет ли семантика COW std :: vector (и я думаю, что и std :: string также) создавать условие гонки между a и b? Если да, могу ли я что-то сделать, чтобы предотвратить это?

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Если предположить, что with_locked_mutex(m) { something } каким-то образом гарантирует, что мьютекс будет получен до блока кода и освобожден после него, две операции будут выполняться во взаимном исключении, поэтому нет, проблема не возникнет.

Иstd::vector не может использовать копирование при записи.

2 голосов
/ 17 марта 2012

AFAIK, std::vector не имеет семантики COW.Оператор присваивания и конструктор копирования всегда копируют каждый элемент.

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