Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что такое кодировка http://www.cyberforum.ru/cpp-beginners/thread1160464.html
Ребята пните меня на соответствующую литературу где внятно и понятно объяснены кодировки. Желательно книжки. Меня на самом деле больше интересуют детали а не водянистые объяснения.
C++ Вычислить значение по заданной формуле Создать программу для вычисления значения функции. При x = 0,4*{10}^{4} y = -0.875 z = -0.475*{10}^{-3} w=1.9873 http://www.cyberforum.ru/cpp-beginners/thread1160444.html
Найти ряд главных элементов матрицы C++
Дано натуральное число n и |a_ij |_(i=1,…,n,j=1,…,m) действительная матрица. Найти ряд главных элементов a_(11,) a_22…,a_(nn ) заранее спасибо
Как создать отдельно список и массив из 20 случайных чисел C++
Как создать отдельно список и массив из случайных чисел для каждого, числа принимают случайное значение (функция random?)
C++ Операторы цикла и операторы передачи управления http://www.cyberforum.ru/cpp-beginners/thread1160394.html
Вычислить сумму ряда S с погрешностью эпсилон, задаваемой с клавиатуры. Вывести количество итераций, сделанных при вычислении. Если вычислить сумму S с погрешностью эпсилон невозможно, вывести...
C++ Операторы ветвления и операторы передачи управления 1. Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. 2. Составить программу, которая печатает сообщение о принадлежности, если точка с координатами (х, у)... подробнее

Показать сообщение отдельно
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68

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

28.04.2014, 20:01. Просмотров 420. Ответов 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 не передаст ему указатель на объект.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru