tldr: требует ли стандарт, чтобы деструктор ared_ptr Заказ доступа к общему объекту до того, как деструктор этого объекта будет вызван в другом потоке? Потому что концептуально все, что делает Shared_ptr, это связывает справочный счетчик с объектом для управления своей жизнью. Выделенный объект по -прежнему доступен через обычный указатель (через get () или перегруженные -> или * операторы), поэтому у Shared_ptr нет никакого способа обеспечить какую -либо дополнительную защиту, даже если он хотел. < /P>
< P> Я был, однако, в предположении, что следующий код не будет содержать расу данных: < /p>
Код: Выделить всё
#include
#include
#include
void foo(std::shared_ptr* in, std::binary_semaphore* flag, int* out)
{
int temp;
{
std::shared_ptr in_copy = *in; //copy shared ptr
flag->release(); //notify parent thread that copy has finished
temp = *in_copy; //read value from shared ptr
//in_copy is destructed
}
*out = temp; //copy value from shared ptr into out
}
int bar()
{
int out_value;
std::binary_semaphore flag{ 0 };
std::thread t1;
{
//create shared_ptr and pass to thread
std::shared_ptr in_value = std::make_shared(15);
t1 = std::thread{ &foo, &in_value, &flag, &out_value };
flag.acquire(); //wait for thread to copy shared_ptr
//in_value is destroyed
}
t1.join(); //wait for thread to finish
return out_value;
}
Код: Выделить всё
void foo(std::shared_ptr* in, std::binary_semaphore* flag, int* out)
{
//copy shared ptr
__refcount* in_refcount = in->get_refcount();
in_refcount->increment();
int* in_copy = in->get();
flag->release(); //notify parent thread that copy has finished
if (in_refcount->decrement_and_check_zero())
{
*out = *in_copy;
destroy in_copy;
}
else
{
*out = *in_copy;
}
}
из [util.smartptr.shared]: < /p>
- реализует семантику общей собственности; Последний оставшийся владелец указателя несет ответственность за уничтожение объекта
Код: Выделить всё
shared_ptr - Изменения в использовании_COUNT () Не отражают изменения, которые могут вводить расы данных
< /ul>
и из [util.smartptr.shared.dest]: < /p> - После *this < /code> было уничтожен все экземпляры shared_ptr , которые общая владение с *this сообщит об use_count () , что на один меньше, чем его предыдущее значение
В основном я могу ' tse ничего в формулировке стандарта, который предоставляет какие -либо гарантии, что операции на объекте, принадлежащем chared_ptr (или любым другим объектам, чьи время жизни ограничены временем срока службы объекта, таких как объекты, принадлежащие уникально Общий объект) имеют отношение к тому, что это происходит, с призывом деструктора общего объекта в другом потоке, и, следовательно, любой код, использующий Shared_ptr Расходы данных между доступом объекта и деструктором объекта. Известно, что объект, принадлежащий chared_ptr Я не могу найти способ интерпретировать стандарт, в котором эти гарантии на заказ обязаны быть предоставленными самим shared_ptr. Так что я бы хотел, если бы кто -то мог указать мне, где именно я это неправильно читаю.
Подробнее здесь: https://stackoverflow.com/questions/794 ... osed-to-be
Мобильная версия