Pull to refresh
15
0
Заболотских Сергей @abby

User

Send message
Пусть в разделяемой памяти находится некоторая информация упакованная в структуру и доступная через указатель. Есть один или множество независимых потоков, которые должны читать и использовать эти данные без модификации, как правило оказывается что для них критически важна скорость доступа. В то же время, пусть существует один или несколько потоков модифицирующих эти данные с нарушением целостности, на практике обычно оказывается что модификации случаются значительно реже и скорость доступа там не настолько важна.

Однако же я, прослышав что std::shared_ptr дает потокобезопасный доступ к контрольному блоку (и не очень понимая что это значит), а так же что операции над ним реализованы lock-free, хочу предложить свое изящное решение:

далее идет пример, того как делать не надо, а, как сказали выше, надо было просто дальше прочитать документацию. Хорошо, но как решить задачу без дополнительных финтов с блокировками?

Заметим, что читающий поток может пропустить часть данных, тогда это можно сделать, используя weak_ptr (считаем, что писатели могут синхронизироваться отдельно, тут задержка не важна). При этом, я считаю, что существует неблокирующий способ передачи этого самого weak_ptr в читающий поток.

Если же смотреть только на код примера, то то можно подумать, что речь идёт о том, что читающий поток живет все время и только и делает, что пытается прочитать данные, которые обновляются, но нечасто, и при этом все равно может пропустить часть данных. На мой взгляд тут проблема поважнее, и она не в деталях чтения памяти, а в подходе в целом. Это либо неэффективно, либо читающий поток захлебнется.
Исходный sp удаляется сразу после std::thread::detach, потому что «заканчивается scope», при этом в другом потоке мы пытаемся получить к нему доступ через std::weak_ptr.
Как ответили выше, это в общем-то и в документации есть. То, что Вы хотите можно сделать при помощи std::weak_ptr. std::weak_ptr::lock должна быть атомарна.
Псевдо-код:
int main() {
  uint32_t i = 10000;
  while (i-- > 0) {
    auto sp = std::make_shared<int>();
    std::weak_ptr p = sp;
    thread([p]{
      if (auto sp = p.lock()) {
        // pointer is valid, Cool, use sp
      } else {
        // pointer is already expired, ignore
      }
    }).detach();
  }
  return 0;
}
Не думаю, что там то, о чём спрашивалось, потому что в этом курсе как раз на обычном персептроне все и заканчивается, а свёрточных цепей там нет.
Интересно было бы узнать, какие алгоритмы они используют, чтобы определить какая кнопка от мошенников, а какая настоящая.
Поправьте, пожалуйста, Adblock на Adblock Plus в
Создатели Adblock выпустили браузер с блокировкой рекламы для iOS и Android
// Извините, не могу найти как написать Вам личное сообщение.
Во-первых, напомнило python, где тут же налетят и предложат десять способов написать правильный for, да еще и для разных версий.

По статье:
  • Все таки типовой код скорее всего работает с полями объектов или, по крайней мере, структур, аллоцирует большое количество новых объектов, частенько обращается к уже выгруженным страницам памяти и так далее. Так что навряд ли вы встретите сортировку чисел пузырьком в большинстве программ.
  • Это хорошо, что Вы тестируете на одних и тех же данных, но в чем смысл сортировать уже отсортированный массив?
  • Да и вообще, производительность числодробильного кода и там и там должна быть примерно одинаковая, основной источних тормозов — неучтенная работа с чем-то медленным, потом работа с памятью, и с большим отставанием идет кривая архитектура.
  • В программах C++ все же довольно часто прибегают к тем или иным способам оптимизации. И там и там сначала профилирование, анализ данных, а потом оптимизация.
Стрелка в Кёльне, ни разу не видел в действии, фото тоже найти не могу. Идея в том, что вагон заезжает, рельсы поворачиваются на другой путь и вагон выезжает.
Достижений пока нет, основная причина — мало времени :)
Круто, я тоже пользовался fiddler'ом, но хотел немного более интеллектуального бота. Поделюсь своей наработкой немного деобфусцированного скипта, правда, одной из предыдущих версий, gist.github.com/abby-sergz/65aad7682de388f14ee2.
В целом большинство моментов справедливы, но аналогия неправильная:
Так же как работа столяра не заключается в использовании молотка или пилы — она заключается в производстве чего-либо при помощи этих инструментов.
Инструменты: молоток и пила — IDE и компилятор. А качество кода — это качество дерева. Если дерево гнилое, то результат работы столяра сломается при первом же прикосновении.

В этом ключе, получается, что код — это не инструмент, а материал. И для хорошего решения как правило требуются определенные свойства материала (каленое железо, сухое дерево, мягкое или жесткое дерево, гладкая поверхность соприкасающихся подвижных частей).

Получение материала с теми или иными свойствами — вот это и есть мастерство.

Поэтому и заказчику или кому бы то ни было нужно не показывать сколько строк написано (сколько дыр просверлено или как гладко отполировали), а объяснять, что отшлифовали те и те детали, и сумели сделать сложное отверстие таким образом, что деталь теперь одна цельная, а это значит, что двигатель сможет нормально работать и не взорвется на презентации.
Поскольку довольно часто встречается такой комментарий, то отвечу на него без иронии.
По моему опыту место для сна, возможно, перебор (как бы это не звучало, оказывается полезно для некоторых гостей), а вот небольшая (или большая) тренажерка, развлечения (типа пинг-понг или еще чего-нибудь) и столовая никак не мешают рабочему процессу, при этом остается время и силы на нормальную личную жизнь.
Тут все просто
  • развлечения в среднем могут занимать 15 мин в день, иногда до 30 мин, при этом позволяют действительно отвлечься, а так же самое важное — пообщаться с коллегами, с которыми иначе общение само собой не начинается по тем или иным причинам.
  • столовая, доступная без дождя, очереди и лишнего шума существенно экономит время и деньги, поход в кафе занимает час-полтора, пообедать и пообщаться в своём кафе, как правило, минут 30-40
  • тренажерный зал. Я заметил, что всякие дополнительные персадки и поездки по пути с работы и на работу довольно сильно утомляют, даже если на машине, то все равно удобнее, чтобы без лишних поездок и хождений. Имея свой зал, улучшается гибкость по времени, исчезают всякие проблемы, типа заботы о вещах, в результате уменьшается утомление.

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

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

Глядя на другие комментари, для меня лично работа не является и никогда не являлась вторым домом, скорее наоборот, пришел в офис, сконцентрировался на своих рабочих обязанностях, сделал что хотел, решил рабочие процессы, остался доволен или недоволен. Вне работы можно со спокойной совестью заниматься своими делами. При этом я не как американцы, для которых работа перестает существовать после шести вечера.

Все это выгодно и работнику, и работодателю, потому что работник успевает разнообразить свою жизнь, лучше развивается, меньше утомляется, лучше сфокусирован, в результате, эффективнее работает, от всего этого лучше себя чувствует, и все по кругу.

ПС: я не имею и не имел никакого отношения ни к ABBYY, ни к Яндексу, ни к другим известным большим компаниям.
Во-первых, такие вещи должны быть обязательно обложены тестами, а, во-вторых, в дизайне и коде есть пара моментов. Самое главное в дизайне — ScopedHandle неудачный пример для производной от Вашего Resource.
Дальше коментарии (возможно, тянут на доп статью) пойдут про ScopedHandle, поскольку статья выше в основном об этом.
— я бы сделал ScopedHandle без предложенного Resource, без std::unique_ptr и ограничился бы поддержкой только тривиальных хендлов (static_assert(std::is_trivial<Handle>::value, "The Handle type should be trivial.");). Это существенно всё упрощает.
— заранее неизвестно, что инициализация ресурса в значение по-умолчанию есть правильно, из этого вытекают всякие моменты почти во всех остальных методах
— так же из первого довольно сильно могут усложниться реализации всяких специфичных производных (речь о using ScopedHandle = Resource<struct HandleTag, Handle>, кстати, неплохо было бы добавить final, вряд ли тут будет к месту наследование, и так довольно сложный фундаментальный класс)
— в качестве конструктора по-умолчанию кажется более логично использовать конструктор с одним аргументом, который принимает resource, и значением по-умолчанию
— нет возможности узнать открыт (валидный) handle или нет
— по моему опыту, публичный метод close оказался очень полезен
— иногда надо иметь возможность получить указатель на уже открытый handle (например, чтобы сложить его в какой-нибудь массив), побочный эффект (side effect), очищающий ресурс тут немного некстати. Это действительно очень спорное решение. В зависимости от ситуации тут может лучше вернуть nullptr, если ресурс уже открыт, вернуть указатель на ресурс без изменений, очистить ресурс (как у Вас) или бросить исключение (пока что во всех моих проектах, я был против варианта бросания исключения).
— неплохо было бы иметь Resource& operator=(ResourceType h)
operator const ResourceType&() const noexcept { return resource_; } тут вопрос с константностью, допустим у нас константный объект, тогда мы можем получить ресурс (хендл), и изменить его, так как он скопируется при передаче в функцию. Тут философский вопрос о побитовой и логической константности, но все же упомянуть стоит. Я бы лично сделал неконстантным, больше помощи от компилятора.
— для Resource& operator=(Resource&& other) я бы воспользовался swap idiom, но так тоже хорошо.
— отсутствие operator bool() const и размышлений на эту тему.

В этой связи я бы ввёл какой-нибудь traits, например,
template<typename Handle, Handle InvalidValueT>
struct BaseScopedHandleTraits {
  typedef Handle Handle;
  typedef Handle* HandlePtr;
  // required to be implemented
  //static bool close(Handle h)

  static Handle initialValue() {
    return InvalidValueT;
  }
  static bool test(Handle value) {
    return InvalidValueT != value;
  }
};
template<HANDLE InvalidValue>
struct WindowsHandleTraits : BaseScopedHandleTraits<HANDLE, InvalidValue> {
  static bool close(Handle h) {
    return 0 != CloseHandle(h);
  }
};


Для документации и тем более для статьи обязательно нужно оговорить все моменты закрытия ресурса. Во-первых, состояние после закрытия должно быть рабочим (в Вашем примере неплохо было бы присвоить хендлу спецальное значение), во-вторых, закрытие должно быть строго детерминировано, а, в-третьих, не должны вызываться закрывающие методы от предыдущих ресурсов (у Вас с этим все хорошо на этам дизайна, теги помогают, а мне повезло поработать и с таким кодом).
Я с нетерпением жду этот браузер и Win10 и настроен позитивно, но все же хотел бы оставить пару комментариев

> Субъективно — браузер быстрый, шустрый, без лагов и лажи.
— субъективно — браузер тормозной, часто все как-то рывками или с задержкой
— заметны баги в отрисовке
— какой-то spartan_legacy.exe жрёт 600МБ
— браузер периодически падает
— console и debug в developer tools не работают, и браузер после этого падает
— почему-то иногда только со второго раза может отрисовать страницу со всеми стилями

> Flash и прочие прелести уже встроены.
> По крайней мере в нем нету ActiveX, поверхность атаки определенно уменьшилась.
Подгружается бинарник Flash.ocx, т.е. поддержка нативных расширений есть, но как подключить свой плагин пока точно неизвестно. Где-то говорилось, что расширения будут совместимы с хоромом, но текущий статус нигде найти не удается.

Если честно, то мне лично дизайн не нравится, я не против плоского, но в IE как-то грязновато и ляповато выглядит, и, пользуюясь случаем, настройки ОС — как будто всех дизайнеров уволили.

В любом случае, хорошо, что дали потрогать, теперь хотя бы можно уже ковыряться. Так же видна активная деятельность, так что можно смело сохранять положительные надежды.
А не пробовали applicationName.exe -platform windows:dpiawareness=0 (https://doc-snapshots.qt.io/qt5-5.4/highdpi.html)?
Еще можно попробовать выключить масштабирование на вкладке совместимости.
Инженерное решение отличное, но не лучше было бы не идти так далеко, а остановиться на известном полифиле?
Всем известно чего ожидать от этого полифила и как с ним работать. Тут же, еще одна версия реализации, потраченные человеко-часы на трансляцию XPath в CSS селекторы и новый сложный хак. Именно чтобы избавиться от таких хаков и решили выпустить новую версию.
Мне кажется, что в этой статье не раскрыта суть уязвимости, в результате создаётся впечатление, что опасность в том, что иконка для ярлыка берется из ресурсов исполняемого файла. А это не так, проблема до сих пор в том, что вместо вызова LoadLibraryEx со спецальным флагом вызывается LoadLibrary.
Доп ссылка: habrahabr.ru/post/163409/

Information

Rating
Does not participate
Date of birth
Registered
Activity