2016-06-19 2 views
-2

все: В соответствии с this page реализации C++ обычно используют атомный номер ref для обеспечения безопасности потоков, но в некоторых случаях это кажется ошибкой.C++ shared_ptr как обеспечить безопасность потоков?

`` `

void func2(shared_ptr<int>* x) { 
    shared_ptr<int> a(*x); 
    *a += 1; 
} 

thread func1() { 
shared_ptr<int> a1(new int(10)); 
thread t (func2, &a1); 
return t; 
} 

` ``

Как выше показывает код, если строительство копии в func2 происходит после того, как внутренний счетчик ссылок на a1 уменьшается, указатель будет удаляются в два раза, правильно?

+7

Багги вещь здесь * ваш * код ... висящий необработанный указатель. – deviantfan

ответ

4

Число ссылок на атомы гарантирует, что только подсчет ссылок является потокобезопасным. Он не превращает ссылочный класс в класс, защищенный потоком. Это не мешает вам писать небезопасный код, например, передавать указатель на std::shared_ptr в новый поток, но уничтожать его до того, как новый поток получит возможность приобрести свою собственную копию.

Вы по-прежнему несете ответственность за то, чтобы писать потокобезопасную логику. Но вы можете рассчитывать на то, что подсчет ссылок будет потокобезопасным.

 Смежные вопросы

  • Нет связанных вопросов^_^