У меня есть вопрос о хорошей практике кода, когда мьютекс должен быть реализован.Рассмотрим следующий пример кода, где есть класс менеджера (Group), который содержит контейнер указателей на объект (Person).
Если класс Group используется несколькими потоками, какой метод является правильным для доступапубличные методы объекта Person?
Потому что, когда я выполняю getPerson (), я получаю указатель.Но когда я пытаюсь выполнить getName (), возможно, объект person уже удален / удален.Как это сделать хорошим способом?
РЕДАКТИРОВАТЬ: этот пример не является многопоточным, но рассмотрим этот класс, используемый в многопоточной среде :)
class Person
{
public:
Person(std::string name, std::string place) :
m_name(name),
m_place(place) {};
~Person() {};
std::string getName(){return m_name;}
std::string getPlace(){return m_place;}
private:
std::string m_name;
std::string m_place;
};
class Group
{
public:
Group() :
m_persons(100) {};
~Group(){};
void createPerson() {
std::lock_guard<std::mutex> l(m_mtx);
Person* p = new Person("John", "London");
m_persons.push_back(p);
}
void removePerson(int index) {
std::lock_guard<std::mutex> l(m_mtx);
m_persons.erase(m_persons.begin() + index);
}
Person* getPerson(int index) {
std::lock_guard<std::mutex> l(m_mtx);
return m_persons[index];
}
private:
std::vector<Person*> m_persons;
std::mutex m_mtx;
};
int main() {
Group g();
g.createPerson();
g.createPerson();
std::cout << g.getPerson(0).getName();
}