Рабочие контракты: высокопроизводительная асинхронная система управления задачами без блокировок
Много лет назад я придумал методику управления асинхронными задачами, которая, насколько мне известно, сильно отличалась и продолжает отличаться от существующих подходов. Типичный подход заключается в том, что задачи помещаются в очередь и выполняются, как только они попадают в начало очереди. В общем случае желательно, чтобы множество потоков потребляли задания из очереди одновременно, что позволяет выполнять несколько заданий либо параллельно, либо на разных процессорах. Для повышения эффективности очередь обычно имеет форму многопотоковой очереди (MPMC Queue) и, как правило, представляет собой конструкцию без блокировок, что позволяет повысить пропускную способность за счет снижения накладных расходов на синхронизацию доступа к очереди при выполнении операций push/pop. Создание эффективной очереди MPMC без блокировок - задача нетривиальная и может быть чревата возникновением тонких условий гонки, если она не реализована со строгим вниманием к деталям. К счастью, существует множество реализаций MPMC-очередей без блокировок, которые широко доступны. Некоторые из них более эффективны, чем другие, и у каждой есть свои недостатки и компромиссы, такие как снижение пропускной способности при сильной конкуренции, слабое упорядочивание (задачи могут быть потреблены в порядке, отличном от того, в котором они были произведены), очереди с фиксированной емкостью, очереди с динамической емкостью и т.д.
https://www.buildingcpp.com/work_contract.htm
#cpp #programming
👉 @cpp_lib
Много лет назад я придумал методику управления асинхронными задачами, которая, насколько мне известно, сильно отличалась и продолжает отличаться от существующих подходов. Типичный подход заключается в том, что задачи помещаются в очередь и выполняются, как только они попадают в начало очереди. В общем случае желательно, чтобы множество потоков потребляли задания из очереди одновременно, что позволяет выполнять несколько заданий либо параллельно, либо на разных процессорах. Для повышения эффективности очередь обычно имеет форму многопотоковой очереди (MPMC Queue) и, как правило, представляет собой конструкцию без блокировок, что позволяет повысить пропускную способность за счет снижения накладных расходов на синхронизацию доступа к очереди при выполнении операций push/pop. Создание эффективной очереди MPMC без блокировок - задача нетривиальная и может быть чревата возникновением тонких условий гонки, если она не реализована со строгим вниманием к деталям. К счастью, существует множество реализаций MPMC-очередей без блокировок, которые широко доступны. Некоторые из них более эффективны, чем другие, и у каждой есть свои недостатки и компромиссы, такие как снижение пропускной способности при сильной конкуренции, слабое упорядочивание (задачи могут быть потреблены в порядке, отличном от того, в котором они были произведены), очереди с фиксированной емкостью, очереди с динамической емкостью и т.д.
https://www.buildingcpp.com/work_contract.htm
#cpp #programming
👉 @cpp_lib
👍3
Форматирование текста на C++ старым и новым способом
Форматирование текста на C++ можно реализовать несколькими способами:
потоками ввода-вывода. В частности, через
функциями printf, в частности
с помощью библиотеки форматирования C++20, в частности
с помощью сторонней библиотеки, в частности
Первые два варианта представляют старые способы. Библиотека форматирования, очевидно, является новым. Но какой из них лучше в плане производительности? Это я и решил выяснить.
Rus https://habr.com/ru/companies/ruvds/articles/761910/
Eng https://mariusbancila.ro/blog/2023/09/12/formatting-text-in-c-the-old-and-the-new-ways/
#cpp #programming
👉 @cpp_lib
Форматирование текста на C++ можно реализовать несколькими способами:
потоками ввода-вывода. В частности, через
std::stringstream
с помощью потоковых операций (таких как operator <<
);функциями printf, в частности
sprintf
;с помощью библиотеки форматирования C++20, в частности
std::format / std::format_to
;с помощью сторонней библиотеки, в частности
{fmt}
(основа новой стандартной библиотеки форматирования).Первые два варианта представляют старые способы. Библиотека форматирования, очевидно, является новым. Но какой из них лучше в плане производительности? Это я и решил выяснить.
Rus https://habr.com/ru/companies/ruvds/articles/761910/
Eng https://mariusbancila.ro/blog/2023/09/12/formatting-text-in-c-the-old-and-the-new-ways/
#cpp #programming
👉 @cpp_lib
👍3
Собираем и запускаем калькулятор из Windows XP в среде Windows 10 c помощью GCC x64
Дисклеймер
Все действия, описанные автором в статье, сделаны исключительно в исследовательских и образовательных целях. Windows является зарегистрированным товарным знаком Microsoft.
Введение
В 2020 году мир облетела новость о сливе исходников Windows XP и Windows Server 2003 на 4Chan. После этого код широко разошелся по интернету, включая GitHub, который принадлежит Microsoft. Последняя, естественно, сразу начала принимать меры по блокировке кода, многие сайты и репозитории были удалены из поиска.
Каков же статус ситуации на 2023 год? Как ни парадоксально, исходники все еще можно найти на GitHub и клонировать без особых проблем. Тщательно поискав, можно найти инструкции и видео, как все собрать инструментами, которые идут в комплекте с исходниками системы.
Среди всех ОС от Microsoft, Windows XP является одной из самых моих любимых ОС. Она весьма быстрая, легковесная, но в тоже время интерфейс достаточно удобен для работы. По этим причинам, а также будучи разработчиком C и С++, мне было весьма интересно исследовать код данной ОС.
https://habr.com/ru/articles/755752/
#cpp #programming
👉 @cpp_lib
Дисклеймер
Все действия, описанные автором в статье, сделаны исключительно в исследовательских и образовательных целях. Windows является зарегистрированным товарным знаком Microsoft.
Введение
В 2020 году мир облетела новость о сливе исходников Windows XP и Windows Server 2003 на 4Chan. После этого код широко разошелся по интернету, включая GitHub, который принадлежит Microsoft. Последняя, естественно, сразу начала принимать меры по блокировке кода, многие сайты и репозитории были удалены из поиска.
Каков же статус ситуации на 2023 год? Как ни парадоксально, исходники все еще можно найти на GitHub и клонировать без особых проблем. Тщательно поискав, можно найти инструкции и видео, как все собрать инструментами, которые идут в комплекте с исходниками системы.
Среди всех ОС от Microsoft, Windows XP является одной из самых моих любимых ОС. Она весьма быстрая, легковесная, но в тоже время интерфейс достаточно удобен для работы. По этим причинам, а также будучи разработчиком C и С++, мне было весьма интересно исследовать код данной ОС.
https://habr.com/ru/articles/755752/
#cpp #programming
👉 @cpp_lib
👍4
Внутри STL: Различные типы блоков управления общим указателем
https://devblogs.microsoft.com/oldnewthing/20230821-00/?p=108626
#cpp #programming
👉 @cpp_lib
https://devblogs.microsoft.com/oldnewthing/20230821-00/?p=108626
#cpp #programming
👉 @cpp_lib
Microsoft News
Inside STL: The different types of shared pointer control blocks
Well, some of them, at least.
👍2
Fibers в C++: основы
Fibers (волокна) менее узнаваемая концепция по сравнению с coroutines (сопрограммами), является довольно мощным дополнением к кооперативной многозадачности. Как графический программист в игровой индустрии, я ценю большую гибкость, которую дают волокна. Я считаю, что эта технология немного недооценена из-за отсутствия достаточного количества общедоступных материалов.
В этой публикации я изложу некоторые из моих знаний об основах волокон. Все, что упомянуто, будет конкретно касаться C++, хотя аналогичная концепция существует и в других языках. Читатели, не имеющие начальных знаний о волокнах, узнают, что это такое и как мы можем использовать их преимущества при рендеринге графики.
https://habr.com/ru/articles/763074/
#cpp #programming
👉 @cpp_lib
Fibers (волокна) менее узнаваемая концепция по сравнению с coroutines (сопрограммами), является довольно мощным дополнением к кооперативной многозадачности. Как графический программист в игровой индустрии, я ценю большую гибкость, которую дают волокна. Я считаю, что эта технология немного недооценена из-за отсутствия достаточного количества общедоступных материалов.
В этой публикации я изложу некоторые из моих знаний об основах волокон. Все, что упомянуто, будет конкретно касаться C++, хотя аналогичная концепция существует и в других языках. Читатели, не имеющие начальных знаний о волокнах, узнают, что это такое и как мы можем использовать их преимущества при рендеринге графики.
https://habr.com/ru/articles/763074/
#cpp #programming
👉 @cpp_lib
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Визуализация алгоритмов стандартной библиотеки C++
В интернете много различных видео, в которых визуализируются алгоритмы. Как правило, такая визуализация делается под определенный алгоритм, и код отрисовки соединен с кодом самого алгоритма. Мне пришла идея отделить визуализацию алгоритма от его исполнения. Тогда можно будет визуализировать любой алгоритм. В том числе алгоритмы стандартной библиотеки С++. Я нашёл способ сделать это, и вот что у меня получилось.
https://habr.com/ru/articles/762554/
#cpp #programming
👉 @cpp_lib
В интернете много различных видео, в которых визуализируются алгоритмы. Как правило, такая визуализация делается под определенный алгоритм, и код отрисовки соединен с кодом самого алгоритма. Мне пришла идея отделить визуализацию алгоритма от его исполнения. Тогда можно будет визуализировать любой алгоритм. В том числе алгоритмы стандартной библиотеки С++. Я нашёл способ сделать это, и вот что у меня получилось.
https://habr.com/ru/articles/762554/
#cpp #programming
👉 @cpp_lib
👍2
Media is too big
VIEW IN TELEGRAM
(Жизненный) cовет от создателя C++
Создатель C++, Бьёрн Страуструп, делится ценными жизненными советами, которыми, скажем прямо, могли бы воспользоваться все разработчики, независимо от их многолетнего опыта. По словам Бьерна, «вы не можете просто писать код», вам нужно развивать больше навыков, если вы хотите стать всесторонним успешным разработчиком. Посмотрите это неизданное интервью, если вы хотите получить вдохновение и рекомендации на своем пути разработчика от одного из OG.
источник
#cpp #programming
👉 @cpp_lib
Создатель C++, Бьёрн Страуструп, делится ценными жизненными советами, которыми, скажем прямо, могли бы воспользоваться все разработчики, независимо от их многолетнего опыта. По словам Бьерна, «вы не можете просто писать код», вам нужно развивать больше навыков, если вы хотите стать всесторонним успешным разработчиком. Посмотрите это неизданное интервью, если вы хотите получить вдохновение и рекомендации на своем пути разработчика от одного из OG.
источник
#cpp #programming
👉 @cpp_lib
👍12
SFINAE, непосредственный контекст, оператор << и '\n'
В этой статье я покажу и объясню странную на вид ошибку, связанную с tuple_size_v и инстанцированием для символа \n. Вы увидите некоторые хитрые места в SFINAE и то, как компилятор строит набор разрешений перегрузки.
https://www.cppstories.com/2022/sfinea-immediate-context/
#cpp #programming
👉 @cpp_lib
В этой статье я покажу и объясню странную на вид ошибку, связанную с tuple_size_v и инстанцированием для символа \n. Вы увидите некоторые хитрые места в SFINAE и то, как компилятор строит набор разрешений перегрузки.
https://www.cppstories.com/2022/sfinea-immediate-context/
#cpp #programming
👉 @cpp_lib
👍1
20 небольших, но полезных функций C++20
С++20 - это огромный и многофункциональный продукт. Вот лишь некоторые из них: Modules, Coroutines, Concepts, Ranges, Calendar & Timezone, Formatting library.
Но, как вы понимаете, это еще не все.
В зависимости от того, как считать, в C++20 появилось около 80 библиотечных функций и 70 изменений в языке, так что есть о чем рассказать :)
В этой статье я покажу вам 20 небольших возможностей C++20, которые очень удобно и полезно знать. Десять элементов языка и еще десять для стандартной библиотеки. Большинство из них сопровождаются интересным примером.
https://www.cppstories.com/2022/20-smaller-cpp20-features/
#cpp #programming
👉 @cpp_lib
С++20 - это огромный и многофункциональный продукт. Вот лишь некоторые из них: Modules, Coroutines, Concepts, Ranges, Calendar & Timezone, Formatting library.
Но, как вы понимаете, это еще не все.
В зависимости от того, как считать, в C++20 появилось около 80 библиотечных функций и 70 изменений в языке, так что есть о чем рассказать :)
В этой статье я покажу вам 20 небольших возможностей C++20, которые очень удобно и полезно знать. Десять элементов языка и еще десять для стандартной библиотеки. Большинство из них сопровождаются интересным примером.
https://www.cppstories.com/2022/20-smaller-cpp20-features/
#cpp #programming
👉 @cpp_lib
👍3
Оптимизация GUI на Qt
Как правило, при создании desktop-приложений на платформе Qt не возникает проблем, связанных с медленностью работы GUI. Qt – платформа достаточно надежная, неплохо вылизанная по всем параметрам, в том числе и по скорости работы. Однако всё же иногда бывают ситуации, когда из-за обилия виджетов графический интерфейс немного притормаживает, и это печально). В этой статье я приведу один частный пример простого графического интерфейса и покажу, как за два шага можно сначала ускорить его в 11 раз, а потом и в целых 34 раза. Вдобавок к этому, я постараюсь немного осветить механизм принятия решения для таких оптимизационных задач, постараюсь показать направление мыслей для правильного решения. Поехали!
https://habr.com/ru/post/672962/
#cpp #programming
👉 @cpp_lib
Как правило, при создании desktop-приложений на платформе Qt не возникает проблем, связанных с медленностью работы GUI. Qt – платформа достаточно надежная, неплохо вылизанная по всем параметрам, в том числе и по скорости работы. Однако всё же иногда бывают ситуации, когда из-за обилия виджетов графический интерфейс немного притормаживает, и это печально). В этой статье я приведу один частный пример простого графического интерфейса и покажу, как за два шага можно сначала ускорить его в 11 раз, а потом и в целых 34 раза. Вдобавок к этому, я постараюсь немного осветить механизм принятия решения для таких оптимизационных задач, постараюсь показать направление мыслей для правильного решения. Поехали!
https://habr.com/ru/post/672962/
#cpp #programming
👉 @cpp_lib
👍4
Правка чужого кода
Для одного проекта мне понадобился просмотрщик памяти в DOS. В идеале хотелось бы иметь редактор памяти, чтобы в нём был поиск по ключевым словам, перемещение к заданному адресу. Но для старта мне было бы достаточно хотя бы возможность просмотра всего мегабайта доступной «нижней» памяти.
https://habr.com/ru/company/timeweb/blog/697688/
#cpp #programming
👉 @cpp_lib
Для одного проекта мне понадобился просмотрщик памяти в DOS. В идеале хотелось бы иметь редактор памяти, чтобы в нём был поиск по ключевым словам, перемещение к заданному адресу. Но для старта мне было бы достаточно хотя бы возможность просмотра всего мегабайта доступной «нижней» памяти.
https://habr.com/ru/company/timeweb/blog/697688/
#cpp #programming
👉 @cpp_lib
👍2
std::atomic_thread_fence
В этом примере два потока выполняют функции
-
-
#cpp #programming
👉 @cpp_lib
std::atomic_thread_fence
— это функция, которая устанавливает порядок синхронизации памяти для не атомарных и расслабленных атомарных доступов, как указано в аргументе order, без связанной атомарной операции.std::atomic_thread_fence
может использоваться для обеспечения правильного порядка чтения и записи в многопоточных программах.В этом примере два потока выполняют функции
write_x_then_y и read_y_then_x
:-
write_x_then_y
устанавливает значение атомарной переменной x равным 1, затем вызывает std::atomic_thread_fence
с аргументом std::memory_order_release
и устанавливает значение атомарной переменной y равным 1.-
read_y_then_x
считывает значение атомарной переменной y, затем вызывает std::atomic_thread_fence
с аргументом std::memory_order_acquire
и считывает значение атомарной переменной x.#cpp #programming
👉 @cpp_lib
👍4
Media is too big
VIEW IN TELEGRAM
Привет 🖐
За несколько дней мои матрицы координально изменились, в момент написания предыдущего поста, матрицы поддерживались лишь стандартом С++20 и выше, на данный момент библиотека настроена и собирается на С++11 С++14 С++17 С++20 С++23
Была пофикшена куча багов, как неочевидных с итераторами, так и простых опечаток.
Могу сказать, что тем, кому лень писать новые матрицы для своих школьных проектов можно смело использовать данную библиотеку, думаю boost использовать непозволительно, а вот библиотеку другого участника School21 вполне можно.
Как раз для этого я создал шаблон cmake проекта MTL (Matrix Template Library) с настроенными зависимости и подтягиванием исходников.
Шаблон можно скачать и попробовать по ссылке, все инструкции того, как настроить проект под себя есть в README .md
#cpp #programming
👉 @cpp_lib
За несколько дней мои матрицы координально изменились, в момент написания предыдущего поста, матрицы поддерживались лишь стандартом С++20 и выше, на данный момент библиотека настроена и собирается на С++11 С++14 С++17 С++20 С++23
Была пофикшена куча багов, как неочевидных с итераторами, так и простых опечаток.
Могу сказать, что тем, кому лень писать новые матрицы для своих школьных проектов можно смело использовать данную библиотеку, думаю boost использовать непозволительно, а вот библиотеку другого участника School21 вполне можно.
Как раз для этого я создал шаблон cmake проекта MTL (Matrix Template Library) с настроенными зависимости и подтягиванием исходников.
Шаблон можно скачать и попробовать по ссылке, все инструкции того, как настроить проект под себя есть в README .md
#cpp #programming
👉 @cpp_lib
👍3
The new static constexpr std::integral_constant idiom
https://www.foonathan.net/2023/08/static-constexpr-integral_constant/
#cpp #programming
👉 @cpp_lib
https://www.foonathan.net/2023/08/static-constexpr-integral_constant/
#cpp #programming
👉 @cpp_lib
www.foonathan.net
The new static constexpr std::integral_constant idiom
The size of std::array<T, N> is known at compile-time given the type.
Yet it only provides a regular .size() member function:
template <typename T, std::size_t N>
struct array {
constexpr std::size_t size() const {
return N;
}
};
This is annoying…
Yet it only provides a regular .size() member function:
template <typename T, std::size_t N>
struct array {
constexpr std::size_t size() const {
return N;
}
};
This is annoying…
👍3
Управление зависимостями с помощью Meson + WrapDB
В одной из недавних статей в блоге рассказывалось о том, как собирать и управлять зависимостями с помощью CMake и FetchContent. В качестве примера использовалось простое GUI-приложение, использующее мультимедийные библиотеки SFML и инструментарий виджетов Dear ImGui с использованием соответствующей библиотеки-обертки. Для сравнения проделаем то же самое с Meson.
https://nibblestew.blogspot.com/2021/05/managing-dependencies-with-meson-wrapdb.html
#cpp #programming
👉 @cpp_lib
В одной из недавних статей в блоге рассказывалось о том, как собирать и управлять зависимостями с помощью CMake и FetchContent. В качестве примера использовалось простое GUI-приложение, использующее мультимедийные библиотеки SFML и инструментарий виджетов Dear ImGui с использованием соответствующей библиотеки-обертки. Для сравнения проделаем то же самое с Meson.
FetchContent_Declare(
sfml
URL https://github.com/SFML/SFML/archive/refs/tags/2.5.1.zip
URL_MD5 2c4438b3e5b2d81a6e626ecf72bf75be
)
add_subdirectory(sfml)
https://nibblestew.blogspot.com/2021/05/managing-dependencies-with-meson-wrapdb.html
#cpp #programming
👉 @cpp_lib
Blogspot
Managing dependencies with Meson + WrapDB
A recent blog post talked about how to build and manage dependencies with CMake and FetchContent . The example that they used was a simple ...
👍1
Минимально жизнеспособный декларативный графический интерфейс на языке C++
https://ossia.io/posts/minimum-viable/
#cpp #programming
👉 @cpp_lib
https://ossia.io/posts/minimum-viable/
#cpp #programming
👉 @cpp_lib
👍3