Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463

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

30.05.2016, 16:52. Показов 3689. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru