Как копирование при записи обеспечивает потокобезопасность?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как копирование при записи обеспечивает потокобезопасность?

Сообщение Anonymous »

Когда я искал, как реализовать копирование при записи на C++, я увидел реализацию, показанную ниже:

Код: Выделить всё

#include 
#include 
#include 

using namespace std;

struct SPersonData
{
string m_name;
string m_surname;
};

class CPerson
{
public:
shared_ptr m_data;

string getName() const;
string getSurname() const;

void rename (const string&, const string&);
};

string CPerson::getName() const
{
if (m_data) return m_data->m_name;
return string();
}

string CPerson::getSurname() const
{
if (m_data) return m_data->m_surname;
return string();
}

void CPerson::rename (const string &name, const string &surname)
{
if (!((m_data) && m_data.unique()))
m_data = make_shared();

m_data->m_name = name;
m_data->m_surname = surname;
}
Однако мне очень интересно, как это обеспечивает потокобезопасность. Во-первых, я знаю, что Shared_ptr не является потокобезопасным, поэтому это может привести к неправильному освобождению объекта в Shared_ptr, если другие потоки обращаются к Shared_ptr в то же время, когда некоторые потоки изменяют Shared_ptr, как показано ниже.

Код: Выделить всё

if (!((m_data) && m_data.unique()))
m_data = make_shared();
Во-вторых, в методе rename() изменениеshared_ptr и присвоение значения не являются атомарными, поэтому, если другие потоки попытаются получить доступ к значениюshared_ptr между потоком, изменяющимshared_ptr и присваивающим значение, они могут получите неправильное значение.
Как правильно реализовать копирование при записи в C++?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ead-safety
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»