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

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

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

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

28.04.2014, 20:01. Просмотров 363. Ответов 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 (параллельное прогр-е)
Посмотрите здесь:

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

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

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

Не работает прогр. Ошибки! - C++
Помогите исправить ошибки.

Реализация разбиения числа с Динам. Прогр - C++
Доброго времени суток. Нужна помощь: как с помощью динамического программирования реализовать решение такой вот задачи: &quot;найти...

Перевод double to double - C++
Всем привет! проблема такая : Есть вектор типа double. Из него надо считать число в переменную, которая тоже имеет тип double. Считываю...

typedef double (*d)(double); - C++
//--------------------------------------------------------------------------- #include &quot;math.h&quot; #include &lt;stdio.h&gt; #include...

Параллельное программирвоание - C++
Всем привет! Не знал в какую тему писать вопрос. решил сюда ибо в этом деле новичок. Начали изучать курс параллельного...

параллельное программирование - C++
Подскажите, пожалуйста! Возвожу положительные числа в степень, а выдается отрицательный результат. Как быть? #include &lt;iostream&gt; ...

Параллельное программирование - C++
Нужно написать простейшую программу для кластера. Читал про MPI, но там тоже есть выбор: из boost-а, OpenMPI, OpenMP, который...

Параллельное программирование - C++
Как составить параллельную программу вычисления среднего арифметического элементов вектора?

Параллельное программирование - C++
Подскажите учебник с помощью которого можно научиться параллельному программированию


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15246 / 6878 / 1092
Регистрация: 02.05.2013
Сообщений: 11,254
Завершенные тесты: 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 (параллельное прогр-е)
Ответ Создать тему
Опции темы

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