о состоянии гонки weak_ptr

1. я опубликовал вопрос (о потокобезопасности weak_ptr) несколько дней назад, и у меня есть другой связанный вопрос сейчас. Если я сделаю что-то подобное, будет ли введено условие гонки как g_w в приведенном выше примере? (Моя платформа - ms vs2013)

std::weak_ptr<int> g_w;

void f3()
{
    std::shared_ptr<int>l_s3 = g_w.lock(); //2. here will read g_w
    if (l_s3)
    {
        ;/.....
    }
}

void f4() //f4 run in main thread
{
    std::shared_ptr<int> p_s = std::make_shared<int>(1);
    g_w = p_s;

    std::thread th(f3); // f3 run in the other thread
    th.detach();
    // 1. p_s destory will motify g_w (write g_w)
}

2. Насколько я знаю, std::shared_ptr/weak_ptr является производным от std::tr1::shared_ptr/weak_ptr, а std::tr1::shared_ptr/weak_ptr — производным от boost::shared_ptr/weak_ptr, есть ли разница в реализации, особенно, в рельефе thread-safe.


person Leonhart Squall    schedule 24.12.2013    source источник
comment
Уничтожение p_s не изменит g_w. Он не будет писать в g_w.   -  person David Schwartz    schedule 13.03.2016


Ответы (2)


Завершенная конструкция std::thread синхронизируется с вызовом указанной функции в создаваемом потоке, т. е. все, что происходит в f4 до построения std::thread th, гарантированно будет видно новому потоку, когда он начинает выполнение f3. В частности, запись в g_w в f4 (g_w = p_s;) будет видна новому потоку в f4.

Утверждение в вашем комментарии // 1. p_s destory will motify g_w (write g_w) неверно. Уничтожение p_s никак не влияет на g_w. В большинстве реализаций он модифицирует общий блок управления, который используется для отслеживания всех общих и слабых ссылок на указатель. Любые такие модификации объектов, внутренних для реализации стандартной библиотеки, являются проблемой библиотеки для обеспечения многопоточности, а не вашей, согласно C ++ 11 § 17.6.5.9/7 «Реализации могут совместно использовать свои внутренние объекты между потоками, если объекты не видны для пользователей и защищены от гонок данных».

Предполагая, что нет параллельных модификаций g_w где-то еще в программе и нет других потоков, выполняющих f3, в этой программе нет гонки данных на g_w.

person Casey    schedule 24.12.2013
comment
Поскольку пространство для добавления комментариев здесь слишком ограничено, чтобы выразить свое мнение, поэтому я публикую свой вопрос как еще один ответ. - person Leonhart Squall; 25.12.2013

@Кейси

Во-первых, я завершаю свой код.

int main()
{
  f4();
  getchar();
  retrun 0;
}

И я нашел код в своей визуальной студии 2013. Есть ли гонка?

person Leonhart Squall    schedule 25.12.2013
comment
Если вы посмотрите на оператор присваивания weak_ptr, вы увидите, что weak_ptr содержат ссылку на управляющий блок, увеличивая _Weaks. Общий объект может быть освобожден, когда последний shared_ptr будет уничтожен, но блок управления со счетчиками ссылок будет жить до тех пор, пока не будет уничтожен последний weak указатель. - person Casey; 25.12.2013
comment
Действительно, спасибо за вашу помощь. Я только что заметил _Uses, но не _Weaks. Итак, в другом вопросе (stackoverflow.com/questions/20705304/ вызывает только f4() в основном, гонки нет, верно? - person Leonhart Squall; 25.12.2013