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

C++

Войти
Регистрация
Восстановить пароль
 
elch10
38 / 21 / 4
Регистрация: 27.04.2015
Сообщений: 164
Завершенные тесты: 2
#1

Блокировка с двойной проверкой. Потоки - C++

31.05.2015, 09:07. Просмотров 380. Ответов 2
Метки нет (Все метки)

Цитата Сообщение от Mr. Hat Посмотреть сообщение
В учебнике Энтони Уильямса "Параллельное программирование на C++" описана проблема при использовании блокировки с двойной проверкой (Double-Checked Locking), из-за которой в стандарт C++11 ввели функцию std::call_once. Не могу понять ее суть. А объясняется она на таком примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::shared_ptr<some_resource> resource_ptr;
std::mutex resource_mutex;
void undefined_behaviour_with_double_checked_locking()
{
   if(!resource_ptr)  (1)
   {
       std::lock_guard<std::mutex> lk(resource_mutex);
       if(!resource_ptr) (2)
       {
            resource_ptr.reset(new some_resource);
       }
   }
   resource_ptr->do_something();  (3)
}
В книге написано: "...возникает гонка, угрожающая не самому указателю, а объекту, на который он указывает; даже если один поток видит, что указатель инициализирован другим потоком, он может не увидеть вновь созданного объекта some_resource, и, следовательно, вызов do_something() будет применен не к тому объекту..."
Та же самая проблема! Ведь этот код должен работать, объясняю почему: если указатель нулевой, то он не инициализирован, тогда захватывается мьютекс и происходит инициализация. Если в данный момент работает другой поток то он может не заметить, что указатель инициализирован в проверке (1), но тогда он будет ждать пока мьютекс освободится от 1 потока. После того как мьютекс освободился 2 поток может продолжить свою работу, но тогда указатель будет уже инициализирован, и проверка (2) уже никогда не будет true, то есть проверка(2) получит false и код внутри проверки (2) не выполнится, далее произойдёт освобождение мьютекса и выход из проверки (1), после чего вызовется функция do_something(). Какая может здесь быть проблема?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2015, 09:07     Блокировка с двойной проверкой. Потоки
Посмотрите здесь:

Цикл с проверкой C++
C++ Одномерный массив с проверкой элементов на повтор
проблема с проверкой вводимых данных C++
C++ Добавление элемента в структурой с проверкой
C++ Мини База Данных фамилий с проверкой
Проблемы с проверкой введённых данных C++
C++ Builder Текстовый редактор с проверкой орфографии
Добавление элемента в список с проверкой уникальности C++
C++ Цикл с проверкой isdigit
Двумерный массив с проверкой условий C++
Многопоточность, блокировка с двойной проверкой C++
C++ Что такое потоки ввода, потоки вывода?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
31.05.2015, 17:12     Блокировка с двойной проверкой. Потоки #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от elch10 Посмотреть сообщение
Какая может здесь быть проблема?
Цитата Сообщение от elch10 Посмотреть сообщение
C++
1
resource_ptr.reset(new some_resource);
Instruction reordering. Компилятор например может представить это так: (2.1) выделение памяти (2.2) вызов reset(...) (2.3) вызов конструктора some_resource. Тогда возможен такой сценарий: 1-й поток выделил память и инициализировал указатель (2.1 - 2.2), но объект ещё не сконструирован; 2-й поток видит уже инициализированный указатель resource_ptr (1) и использует "не до конца созданный" объект (3).
elch10
38 / 21 / 4
Регистрация: 27.04.2015
Сообщений: 164
Завершенные тесты: 2
01.06.2015, 12:15  [ТС]     Блокировка с двойной проверкой. Потоки #3
Спасибо большое!
Yandex
Объявления
01.06.2015, 12:15     Блокировка с двойной проверкой. Потоки
Ответ Создать тему
Опции темы

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