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

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

Восстановить пароль Регистрация
 
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
28.04.2014, 20:01     В чем опасность Double-Checked Locking (параллельное прогр-е) #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++ invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’
Какая-нибудь реализация функции void Fun (double in, double *out) C++
C++ Объяснить, что это значит double *F; F=new double[n];
C++ Деструктор (опасность удаления)
C++ long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей
C++ std::copy из vector<double> в *double, непонятный warning
Домашнее задание ошибки double circle_area(double R) C++
C++ Вывести long double число без перевода в double

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14220 / 6235 / 988
Регистрация: 02.05.2013
Сообщений: 10,403
Завершенные тесты: 1
28.04.2014, 21:22     В чем опасность Double-Checked Locking (параллельное прогр-е) #2
Цитата Сообщение от Mr. Hat Посмотреть сообщение
resource_ptr.reset(new some_resource);
Я так понимаю, что в этой строке не гарантируется, что сначала будет
создан новый объект some_resource, и только потом указатель на него
записан в resource_ptr. Может быть так: сначала будет выделена память
под some_resource (1), этот указатель затем запишется в resource_ptr (2), и
только после этого у объекта будет вызван конструктор (3). Полагаю, что
опасность в том, что между (2) и (3) в функцию может войти другой
поток, который будет видеть, что в resource_ptr уже записано какое-то
ненулевое значение, т.е. поток "посчитает", что объект уже инициализирован.
Хотя на самом деле там еще "мусор".
Yandex
Объявления
28.04.2014, 21:22     В чем опасность Double-Checked Locking (параллельное прогр-е)
Ответ Создать тему
Опции темы

Текущее время: 14:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru