Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
#1

В чем опасность Double-Checked Locking (параллельное прогр-е) - C++

28.04.2014, 20:01. Просмотров 371. Ответов 1
Метки нет (Все метки)

В учебнике Энтони Уильямса "Параллельное программирование на C++" описана проблема при использовании блокировки с двойной проверкой (Double-Checked Locking), из-за которой в стандарт C++11 ввели функцию std::call_once. Не могу понять ее суть. А объясняется она на таком примере:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::shared_ptr<some_resource> resource_ptr;
std::mutex resource_mutex;
 
void undefined_behaviour_with_double_checked_locking()
{
    if(!resource_ptr)
    {
        std::lock_guard<std::mutex> lk(resource_mutex);
        if(!resource_ptr)
        {
            resource_ptr.reset(new some_resource);
        }
    }
    resource_ptr->do_something();
}
В книге написано: "...возникает гонка, угрожающая не самому указателю, а объекту, на который он указывает; даже если один поток видит, что указатель инициализирован другим потоком, он может не увидеть вновь созданного объекта some_resource, и, следовательно, вызов do_something() будет применен не к тому объекту..."

Как может вызов функции применяться "не к тому объекту"? Даже если забыть, что resource_ptr указывает либо на тот объект, какой надо, либо вообще ни на что не указывает, как вообще он может указывать не на тот объект? Если я правильно понимаю работу shared_ptr, информация об объекте там всегда свежая - он не перестанет быть NULL, пока функция reset не передаст ему указатель на объект.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2014, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем опасность Double-Checked Locking (параллельное прогр-е) (C++):

Data race. Печально известный double checked locking - C++
Читаю Concurrency in action C++. Наткнулся на такой пример: void undefined_behaviour_with_double_checked_locking() { ...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

В чем разница между Double и Float? - C++
Хмм? :(

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Деструктор (опасность удаления) - C++
Насколько опасно в деструкторе напрямую прописывать delete this? class MyClass { int a, b; AnotherClass* c; public : static int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15512 / 7010 / 1108
Регистрация: 02.05.2013
Сообщений: 11,442
Завершенные тесты: 1
28.04.2014, 21:22 #2
Цитата Сообщение от Mr. Hat Посмотреть сообщение
resource_ptr.reset(new some_resource);
Я так понимаю, что в этой строке не гарантируется, что сначала будет
создан новый объект some_resource, и только потом указатель на него
записан в resource_ptr. Может быть так: сначала будет выделена память
под some_resource (1), этот указатель затем запишется в resource_ptr (2), и
только после этого у объекта будет вызван конструктор (3). Полагаю, что
опасность в том, что между (2) и (3) в функцию может войти другой
поток, который будет видеть, что в resource_ptr уже записано какое-то
ненулевое значение, т.е. поток "посчитает", что объект уже инициализирован.
Хотя на самом деле там еще "мусор".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2014, 21:22
Привет! Вот еще темы с ответами:

Double checked locking - C#
Добрый день, подскажите. например есть некая реализация паттерна Double checked locking. И вдруг нам стукнуло поменять Do = new...

в чем опасность для взлома алгоритма rsa - Алгоритмы
Препод задал вопрос, Если завтра утром отвечу - 5, если нет - 4 Надо объяснить в чем опасность для взлома алгоритма rsa. адо закончить...

Структуры могут быть мутабельными - в чем опасность - C#
Прочитал, что структуры могут быть мутабельными. Не очень понял, в чем прикол и в чем вообще проблемы, пока не увидел пару примеров....

Объясните смысл локальной переменной в double-checked singleton - Java SE
Привет! Что-то не могу понять сокрального смысла локальной переменой в этом коде public class Singleton { private static...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru