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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с LPT портом с использованием библиотеки inpout32.dll http://www.cyberforum.ru/cpp/thread1462253.html
Нужно записать и считать данные с lpt порта . Делаю небольшую программку с использованием библиотеки inpout32.dll : // ConsoleApplication3.cpp : Defines the entry point for the console...
C++ Конвертация картинки из 24bit в 8bit Здравствуйте. Нужно написать программу для конвертации изображение из 24bit в 8bit. Подскажите в каком направление двигаться, или какой алгоритм использовать. Может есть какой нибудь сайт или книжка... http://www.cyberforum.ru/cpp/thread1462151.html
C++ Класс log, выводящий в cout и в syslog
Для логгирования в Linux-системе (для самого вопроса это не важно) хочу использовать свой класс с перегруженным operator<<(). Лог должен писаться в std::cout и в syslog. class sLog { ..... } ...
C++ Принципы реализации SOAP web service
Итак. Я должен реализовать SOAP web service на c++. Сервис должен хоститься на Apache Axis2/C, использовать ODBC/OLE DB. В общем я пока не понимаю что надо делать. Что такое веб сервис я уже почитал...
C++ Создание виртуального обработчика ошибок в Visual Studio http://www.cyberforum.ru/cpp/thread1457550.html
Доброго времени суток! Нужно написать так называемый Виртуальный менеджер памяти, который бы автоматически начинал работать при подключении определенной (моей) библиотеки. Суть библиотеки в том,...
C++ Исходный код лексического анализатора Может есть у кого то исходник по ООП программы лексического анализатора Очень нужен пример Помогите пожалуйста подробнее

Показать сообщение отдельно
elch10
38 / 21 / 4
Регистрация: 27.04.2015
Сообщений: 164
Завершенные тесты: 2

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

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