Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
elch10
40 / 21 / 3
Регистрация: 27.04.2015
Сообщений: 176
Завершенные тесты: 2
1

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

31.05.2015, 09:07. Просмотров 608. Ответов 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(). Какая может здесь быть проблема?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2015, 09:07
Ответы с готовыми решениями:

Многопоточность, блокировка с двойной проверкой
Всем привет! Читаю книгу по многопоточности: &quot;...будет применен не к тому объекту что нужно&quot; -...

Потоки - Блокировка/Синхронизация
Доброго времени суток дорогие форумчане. Возникла проблем с осваением потоков,а именно : имеем...

Потоки, блокировка не работает
Напишу код сразу. Основной код, смотрите закомментированые строчки: private void...

Потоки из пула и блокировка
почему с потоками из пула не рекомендуется использовать блокировку? почему проседает...

Блокировка клавиши при нажатии в одной форме и блокировка в другой, третьей
Здравствуйте нужно что бы при вызове помощи в 1ом вопросе она блокировалась во 2ом...

2
gray_fox
What a waste!
1557 / 1262 / 166
Регистрация: 21.04.2012
Сообщений: 2,641
Завершенные тесты: 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).
1
elch10
40 / 21 / 3
Регистрация: 27.04.2015
Сообщений: 176
Завершенные тесты: 2
01.06.2015, 12:15  [ТС] 3
Спасибо большое!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2015, 12:15

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...

Байтовые потоки и потоки символов
Объясните, пожалуйста подробно что имелось ввиду На самом низком уровне все операции ввода/вывода...

Копирование с проверкой
добрый день. на форме выполняю копирование файлов следующим образом: Sub Copy_File() Dim...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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