Pull to refresh
0
0
Send message
Судя по статье, программисты бывают трех видов: 1С, аутсорс и веб-программисты. КГ/АМ.

Программист получает больше, потому что производимый им продукт «бесконечно воспроизводим», не имеет срока годности, и в теории приносит бесконечную прибыль, потому что затраты на продажу каждой следующей копии при использовании цифровой дистрибуции равны нулю.
Отнють, первичную проверку разумно делать вне мьютекса, а под мьютексом перед второй проверкой уже и mfence можно выполнить.
В общем случае, как говорит стандарт языка, implementation defined outside scope of this document. Я, честно говоря, потерял нить дискуссии.
Ты меня пытаешься убедить, что «static T t; T *pt = &t;» лучше, чем «T* pt = new T» в многопоточной среде?
Из интеловскиз мануалов.
Я рассматриваю вариант, когда под мьютексом стоит pt = new T — полная эквивалентность за исключением выделения памяти.
Ни в коем случае! Завершение записи значения value в память по адресу mem означает, что чтение этого адреса на любом из ядер вернет одинаковый результат — value. Но если в программе есть код
a = b; c = d;
то возможно, что в момент присваивания c = d, в a еще не лежит значение b, потому что возможна параллельная запись в непересекающиеся регионы памяти. Однако чтение a в любой момент после a = b даст b.
Некая «недетерминированность» между ядрами как раз и отражает это: переход к «c = d» на одном ядре не означает, что оно завершило «a = b», из-за чего новое значение a может быть «не видно» остальным ядрам. Для этого и придумали memory barriers (которые, кстати, одинаково отсутствуют в обоих вариантах.
Тогда чем такая ситуация отличается от финального варианта со статическим синглтоном под мьютексом?
О каких оптимизациях идет речь? О том, что mov [mem],value, выполенный на одном ядре, может быть «не виден» на другом?
Я для галочки чтоли дал ссылку на пункт «Expressions»? В pt не будет записано значение до тех пор, пока не будет вычислена правая часть выражения «pt = new T», то есть пока не завершится вычисление «new T».
>void *pt = operator new(sizeof(T));
И где здесь статическая переменная?
Пардон, для C++11 это будет 5 Expressions и 5.17 Assignment and compound assignment operators
6.5 Expressions; 6.5.16.1 Simple assignment
Ну, в общем, эту гениальную догадку автора статьи можно смело убирать, поскольку она противоречит, в том числе, и стандарту.
Нет там никакого динамического выделения памяти

RTFM
Рассмотрим это поподробнее. Данную строчку можно переписать следующим образом (я опущу обработку исключений для краткости)

Это все равно что сказать, что «a = b + c + d» можно записать в виде «a = b; a += c; a += d». Да, можно, но ткните меня носом в место стандарта, где сказано, что компилятор может так делать. Сначала будет вычислена правая часть выражения, и только потом произведено присваивание. Инициализация объекта входит в этот самый процесс вычисления правой части.
Так много грандиозных проектов на кикстартере набрали нужную сумму, а много из них успешно завершатся? Меня не оставляет чувство какого-то мыльного пузыря, которые начнут лопаться во множестве уже менее чем через год. Хотя может быть, это российский менталитет — видеть лохотрон в каждом сборе средств на благие начинания.
Boost Asio

Зачем нужна эта громадина, когда есть libev/libevent или epoll/kqueue для любителей все делать своими руками?
имея на руках данные о прекрасной производительности


Почти секунда на установку соединения как-то не вяжется в моем понимании с «прекрасной производительностью».
Возможно, если бы его не было, среднее время соединения было бы значительно меньше секунды.
libuv


В смысле от библиотек, которые делают веб-разработку удобнее? Это для области «менее 500 запросов в секунду». Проблема c10k/c100k, как правило, либо нивелируется фронтендом, за которым живут десятки бакендов с этими «libuv», либо решается вручную с минимумом фреймворков и элементами тактодрочерства.

Information

Rating
Does not participate
Registered
Activity