Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463

Data race. Печально известный double checked locking

30.05.2016, 16:52. Показов 3723. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю Concurrency in action C++.
Наткнулся на такой пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void undefined_behaviour_with_double_checked_locking()
{
    if(!resource_ptr)
    {
        std::lock_guard<std::mutex> guard(resource_mutex);
        if(!resource_ptr)
        {
            resource_ptr.reset(new some_resource);
        }
    }
 
    resource_ptr->do_something();
}
Утверждается, что тут будет data racing и дается объяснение, почему именно так, но я не могу его понять. Помогите растолковать.
Миниатюры
Data race. Печально известный double checked locking  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2016, 16:52
Ответы с готовыми решениями:

В чем опасность Double-Checked Locking (параллельное прогр-е)
В учебнике Энтони Уильямса &quot;Параллельное программирование на C++&quot; описана проблема при использовании блокировки с двойной проверкой...

Double checked locking
Добрый день, подскажите. например есть некая реализация паттерна Double checked locking. И вдруг нам стукнуло поменять Do = new...

Объясните смысл локальной переменной в double-checked singleton
Привет! Что-то не могу понять сокрального смысла локальной переменой в этом коде public class Singleton { private static...

25
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.05.2016, 22:28
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Toshkarik Посмотреть сообщение
Так сам стандарт, нет? Ведь должна соблюдатся последовательность, пусть хоть заоптимизируется.
На последовательность пофиг, имеют значение только зависимости по данным.

Nosey, какое отношение volatile имеет к многопоточности? Правильно, никакого (если не зацикливаемся на VC).

Цитата Сообщение от Nosey Посмотреть сообщение
как зависимые инструкции write read могут поменяться местами?
Если эти volatile области памяти разные, то они вполне независимые. Как я понял, речь именно об этом. Хотя я не понял утверждение, почему их типа только проц может зареордерить, а компилятор ни-ни.
1
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
30.05.2016, 22:44
Цитата Сообщение от ct0r Посмотреть сообщение
какое отношение volatile имеет к многопоточности? Правильно, никакого (если не зацикливаемся на VC).
Правильно, никакого

Цитата Сообщение от ct0r Посмотреть сообщение
Если эти volatile области памяти разные, то они вполне независимые.
Если разные - то там конечно может твориться что угодно. Я понимал что процессор как-то может зареодерить доступ к одной области, поэтому и спрашиваю, как так, если это так, то в моей голове присутствует черная дыра которую я хотел бы попробовать заполнить

Цитата Сообщение от ct0r Посмотреть сообщение
почему их типа только проц может зареордерить, а компилятор ни-ни.
А это касается волатильных данных, с ними компилятору баловаться запрещено.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.05.2016, 00:01
Цитата Сообщение от Nosey Посмотреть сообщение
Если разные - то там конечно может твориться что угодно.
По стандарту что угодно - это до следующей sequence point

Цитата Сообщение от Nosey Посмотреть сообщение
А это касается волатильных данных, с ними компилятору баловаться запрещено.
По стандарту последовательность доступа к volatile памяти (даже разной) не должна меняться. Это значит, что компилятор должен для каждой архитектуры генерить такой код, чтобы проц не мог переупорядочить их. Если в каких-то целях (эффективности например) компилятор этого не делает, то в принципе пофиг, проц там что переупорядочивает или сам компилятор, - сам по себе запрет становится не таким уж осмысленным.
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
01.06.2016, 02:26  [ТС]
Нашел кое-что по этой теме, статья, опубликованная Скоттом Мейерсом и Андреем Александреску в 2004ом году.
http://www.aristeia.com/Papers... evised.pdf

Добавлено через 9 минут
и возможные варианты решения: http://preshing.com/20130930/d... -in-cpp11/
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 07:31
Цитата Сообщение от ASCII Посмотреть сообщение
Офигеть просто. Спасибо. А что можно почитать об этом? Ибо в таких низкоуровневых вещах я ноль.
Для того, чтобы сделать вывод, что в коде есть data race, не нужно разбираться в низкоуровневых вещах типа перестановки инструкций компилятором/процессором, write buffer-ах и прочих когерентностях кешей.
Это доказывается в терминах многопоточной модели исполнения кода C++.
Конечно, знать о мотивации этой модели полезно.
Но, повторюсь, для доказательства не нужно лезть в детали типа "а вот если процессор переставит инструкции..." и т.п.
1
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
22.10.2024, 17:49  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
По стандарту что угодно - это до следующей sequence point
C++
1
auto object = new ObjectType;
Здесь мы по сути имеем три операции:
1. Выделить память под объект типа ObjectType
2. Сконструировать объект в выделенной памяти
3. Присвоить value compupations of new expression переменной object

Раньше, как описано в совместной статье Мейерса и Александреску, компилятор мог переопределить порядок следования операций #2 и #3.

А на сегодняшний момент учитывая https://eel.is/c++draft/expr.new#25
Кликните здесь для просмотра всего текста

The invocation of the allocation function is sequenced before the evaluations of expressions in the new-initializer. Initialization of the allocated object is sequenced before the value computation of the new-expression.


не ограничивает ли это компилятор по реордерингу?

Ведь порядок вычисления new expression сейчас на основе sequenced before выглядит так:

operator new() => new-initializer evaluations => initializing object => result
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2024, 17:49

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Если checked радиокнопка с именем 1, то снять checked с группы 2. Как?
Здравствуйте. Создаю программку на пхп,что-то вроде теста на радио-кнопках Нужно чтобы человек мог выбрать либо группу кнопок с...

Как можно задать checked или что то еще другим значениям на сайте ? А то при использовании checked для дргого
Как можно задать checked или что то еще другим значениям на сайте ? А то при использовании checked для дргого элемента, первый перестает...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Ошибка в коде программы. conversion from 'double' to 'int', possible loss of data, error C2018: unknown charact
#include &lt;iostream.h&gt; int add3(int, int, int); double average(int); void main() { int score_l, score_2, score_3, sum; ...


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

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

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru