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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Что такое кодировка http://www.cyberforum.ru/cpp-beginners/thread1160464.html
Ребята пните меня на соответствующую литературу где внятно и понятно объяснены кодировки. Желательно книжки. Меня на самом деле больше интересуют детали а не водянистые объяснения.
C++ Передача звука по сети. DirectSound В общем-то, требуется записать звук с микрофона, передать его по сети и воспроизвести. Знаю, что тема поднималась много раз, но ничего путнего таки не нашел. У меня в принципе, два вопроса. 1) Как передавать звук? То есть, я записываю звук в CaptureBuffer, передаю его по сети, преобразую в SoundBuffer (первичный/вторичный?) и играю. Возможно ли это? Или мне нужно захватывать звук в буффер, потом... http://www.cyberforum.ru/cpp-beginners/thread1160463.html
C++ Вычислить значение по заданной формуле
Создать программу для вычисления значения функции. При x = 0,4*{10}^{4} y = -0.875 z = -0.475*{10}^{-3} w=1.9873
Найти ряд главных элементов матрицы C++
Дано натуральное число n и |a_ij |_(i=1,…,n,j=1,…,m) действительная матрица. Найти ряд главных элементов a_(11,) a_22…,a_(nn ) заранее спасибо
C++ Как создать отдельно список и массив из 20 случайных чисел http://www.cyberforum.ru/cpp-beginners/thread1160435.html
Как создать отдельно список и массив из случайных чисел для каждого, числа принимают случайное значение (функция random?)
C++ Операторы цикла и операторы передачи управления Вычислить сумму ряда S с погрешностью эпсилон, задаваемой с клавиатуры. Вывести количество итераций, сделанных при вычислении. Если вычислить сумму S с погрешностью эпсилон невозможно, вывести сообщение и завершить выполнение программы. #include <iostream> using namespace std; main() { float s=0, eps, Fp; int n=1, iter=0; подробнее

Показать сообщение отдельно
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
28.04.2014, 20:01     В чем опасность Double-Checked Locking (параллельное прогр-е)
В учебнике Энтони Уильямса "Параллельное программирование на 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 не передаст ему указатель на объект.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru