Pull to refresh
1
0
Send message

Полезные идиомы многопоточности С++

Reading time25 min
Views82K

Введение

Данная статья является продолжением цикла статей: Использование паттерна синглтон [1], Синглтон и время жизни объекта [2], Обращение зависимостей и порождающие шаблоны проектирования [3], Реализация синглтона в многопоточном приложении [4]. Сейчас я хотел бы поговорить о многопоточности. Эта тема настолько объемна и многогранна, что охватить ее всю не представляется возможным. Здесь я заострю внимание на некоторых практичных вещах, которые позволят вообще не думать о многопоточности, ну или думать о ней в крайне минимальном объеме. Если говорить точнее, то думать о ней только на этапе проектирования, но не реализации. Т.е. будут рассмотрены вопросы о том, как сделать так, чтобы автоматически вызывались правильные конструкции без головной боли. Такой подход, в свою очередь, позволяет значительно уменьшить проблемы, вызванные состояниями гонок (race condition, см. Состояние гонки [5]) и взаимными блокировками (deadlock, см. Взаимная блокировка [6]). Этот факт уже сам по себе представляет немалую ценность. Также будет рассмотрен подход, который позволяет иметь доступ к объекту из нескольких потоков одновременно без использования каких-либо блокировок и атомарных операций!
Еще...
Total votes 71: ↑66 and ↓5+61
Comments46

Поддержка The Neverhood добавлена в ScummVM

Reading time4 min
Views59K


Несколько дней назад, 15 мая, в ScummVM, известный кроссплатформенный набор игровых движков для point-and-click adventure, была добавлена ветка кода с движком, который поддерживает классику квестового жанра, игру The Neverhood.

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

Продолжим
Total votes 126: ↑123 and ↓3+120
Comments92

Логическая организация кэш-памяти процессора

Reading time3 min
Views39K
На днях решил систематизировать знания, касающиеся принципов отображения оперативной памяти на кэш память процессора. В результате чего и родилась данная статья.

Кэш память процессора используется для уменьшения времени простоя процессора при обращении к RAM.

Основная идея кэширования опирается на свойство локальности данных и инструкций: если происходит обращение по некоторому адресу, то велика вероятность, что в ближайшее время произойдет обращение к памяти по тому же адресу либо по соседним адресам.

Логически кэш-память представляет собой набор кэш-линий. Каждая кэш-линия хранит блок данных определенного размера и дополнительную информацию. Под размером кэш-линии понимают обычно размер блока данных, который в ней хранится. Для архитектуры x86 размер кэш линии составляет 64 байта.



Так вот суть кэширования состоит в разбиении RAM на кэш-линии и отображении их на кэш-линии кэш-памяти. Возможно несколько вариантов такого отображения.
Читать дальше →
Total votes 58: ↑57 and ↓1+56
Comments10

Как сделать MMORPG своими руками. Медленно, сложно, интересно

Reading time4 min
Views32K
Привет, хабрахабр! Меня зовут Егор Курьянович и ты, возможно, помнишь меня по паре интернет-проектов: Кьюби и Идейнику. А быть может, ты даже слышал о других моих начинаниях. Сегодня я хочу рассказать тебе, чем занимался последние пару лет.



Ты ведь любишь игры, не так ли? То, что ты видишь на КДПВ, называется FAR7. Чтобы было немного понятнее, скажу, что молодежь сравнивает её с Космическими Рейнджерами, те кто постарше, вспоминают StarControl2, а совсем уже хардкорные геймеры постоянно твердят об Elite. Сойдемся на том, что это браузерный космосим. В игре вы можете путешествовать между звездными системами, торговать, воевать и выполнять различные миссии.

Вся игра написана мною с нуля в одиночку и может быть использована как демо, для демонстрации возможностей стека HTML5. Все подробности о технологиях и трудностях разработки инди-проектов ждут вас под катом.
Читать дальше →
Total votes 190: ↑176 and ↓14+162
Comments66

Премьера отечественного фан-фильма по игре «Half-life 2»

Reading time1 min
Views48K

Хабр, представляю тебе проект экранизации компьютерной игры «Half-Life 2».


Первая из четырех серий фанатского проекта должна выйти в ближайшее время вышла на просторы интернета. А пока посмотрите трейлер:

Cтоит отметить, что вся эта затея носит исключительно некоммерческий характер и делается только из-за большой любви к материалу.

Что это? Это — любительский фан фильм, действие которого разворачивается полностью во вселенной Half-Life 2 и, более или менее, идет по сценарию оной же. Все действие будет разбито на дни (читай, серии). Соответственно, первый день — прибытие Фримена в City 17, встреча с Барни, побег от комбайнов и заканчивается знакомством с метрокоповским разрядником на чердаке одного из домов. Ну, вы помните, потом Алекс… и т.д.

Читать дальше →
Total votes 176: ↑159 and ↓17+142
Comments69

Использование драйверов из Android приложения

Reading time7 min
Views46K
Рут даёт практически абсолютную власть над Android устройством. Сегодня я расскажу вам как получить еще больше имея склонность к программированию и желание исследовать систему на своём устройстве. Кто заинтересовался — прошу под кат.
Читать дальше →
Total votes 55: ↑49 and ↓6+43
Comments11

А вы хорошо знаете статическую маршрутизацию?

Reading time12 min
Views204K
Статический маршрут — первое, с чем сталкивается любой человек при изучении понятия маршрутизации IP пакетов. Считается, что это — наиболее простая тема из всех, в ней всё просто и очевидно. Я же постараюсь показать, что даже настолько примитивная технология может содержать в себе множество нюансов.
Следите за руками.
Total votes 68: ↑65 and ↓3+62
Comments53

Мультфильм на осциЛЛографе

Reading time1 min
Views116K
Потрясающая работа, проделанная умельцем.



Пока автор делал этот шедевр, он:
— получил кучу знаний по оптике и лазерам
— научился работать с ПЛИС (оно же FPGA)
— использовать USB2.0 на полной скорости (поток точек и тайминги идут по usb в плис)
— познакомился с Qt
— научился писать драйвера под Linux

Впечатляет.
Total votes 338: ↑317 and ↓21+296
Comments95

Работаем с модулями ядра в Linux

Reading time7 min
Views260K

Ядро — это та часть операционной системы, работа которой полностью скрыта от пользователя, т. к. пользователь с ним не работает напрямую: пользователь работает с программами. Но, тем не менее, без ядра невозможна работа ни одной программы, т.е. они без ядра бесполезны. Этот механизм чем-то напоминает отношения официанта и клиента: работа хорошего официанта должна быть практически незаметна для клиента, но без официанта клиент не сможет передать заказ повару, и этот заказ не будет доставлен.
В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского. Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В случае с ядром Linux — это правда лишь отчасти: ядро Linux может работать в таком режиме, однако, в подавляющем большинстве сборок возможна модификация части кода ядра без его перекомпиляции, и даже без его выгрузки. Это достигается путем загрузки и выгрузки некоторых частей ядра, которые называются модулями. Чаще всего в процессе работы необходимо подключать модули драйверов устройств, поддержки криптографических алгоритмов, сетевых средств, и, чтобы уметь это правильно делать, нужно разбираться в строении ядра и уметь правильно работать с его модулями. Об этом и пойдет речь в этой статье.
Читать дальше →
Total votes 120: ↑113 and ↓7+106
Comments50

Как запустить программу без операционной системы

Reading time13 min
Views182K

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

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

Итак, цель: затратив как можно меньше усилий, создать собственную загрузочную флешку, которая всего-навсего печатает на экране компьютера классический “Hello World”.

Читать дальше →
Total votes 196: ↑188 and ↓8+180
Comments69

Как собрать бинарный deb пакет: подробное HowTo

Reading time15 min
Views221K
Сегодня я расскажу на абстрактном примере как правильно создать *.deb пакет для Ubuntu/Debian. Пакет мы будем делать бинарный. Пакеты, компилирующие бинарники из исходников здесь не рассматриваются: осилив изложенные ниже знания, в дальнейшем по готовым примерам можно понять суть и действовать по аналогии :)

В статье не будет никакой лишней возни «вручную»: формат пакета эволюционировал в достаточно простую, а главное — логичную структуру, и всё делается буквально на коленке, с применением пары специализированных утилит.

В качестве бонуса в конце статьи будет пример быстрого создания собственного локального репозитория: установка пакетов из репозитория позволяет автоматически отслеживать зависимости, и конечно же! — устанавливать всё одной консольной командой на нескольких машинах :)

Для тех, кто не хочет вдаваться в мощную систему установки софта в Linux, рекомендую посетить сайт проги CheckInstall: она автоматически создаёт deb-пакет из команды «make install» ;) А мы вместе с любопытными —
поехали дальше!
Total votes 73: ↑63 and ↓10+53
Comments40

Модульное тестирование и непрерывная интеграция при помощи Jenkins для C++ проектов

Reading time12 min
Views59K
Думаю, что все знают, что такое модульные тесты, все знают или, по крайней мере, слышали, что такое непрерывная интеграция, и многие программируют на C++. Но я столкнулся с тем, что в интернете не так много информации о том, как же это все объединить и заставить работать вместе. Эта статья является попыткой дать новичками пошаговую инструкцию, которая позволит сделать первый шаг в создании модульных тестов для C++ проектов и организовать покоммитный прогон модульных тестов при помощи CI сервера.
Update: План:
  1. Напишем HelloWorld
  2. Настроим сборку HelloWorld на Jenkins
  3. Напишем модульный тест для HelloWorld
  4. Настроим прогон модульных тестов на Jenkins

Внимание: много букв и скриншотов, половина из которых избыточны. Особенно для тех кто уже в теме.

Читать дальше →
Total votes 32: ↑31 and ↓1+30
Comments12

Простейший делегат на C++

Reading time7 min
Views85K
logoВ C# есть делегаты. В python есть делегаты. В javascript есть делегаты. В Java есть выполняющую их роль замыкания. А в C++ делегатов нет O_O. Многие талантливые программисты успешно борются с этим недостатком, разрабатывая и используя sigslots, boost::function и другие ценные и нужные библиотеки. К сожалению, большинство реализаций отличаются не только методом использования, но также эпической сложностью применяемой шаблонной магии. Дабы при изучении исходников boost::function волосы не вставали дыбом, я написал эту небольшую статью, показывающую как самым простым и топорным способом реализовать делегат на C++. Описанная реализация является иллюстративной, имеет множество недостатков и ее вряд ли можно применить в серьезных проектах — зато она максимально простая и позволяет ознакомиться с предметной областью не разбирая трехэтажные шаблоны sigslots :).

Посмотреть схему велосипеда - много текста и картинок
Total votes 50: ↑43 and ↓7+36
Comments45

Юнит-тестирование для чайников

Reading time15 min
Views1.1M
Даже если вы никогда в жизни не думали, что занимаетесь тестированием, вы это делаете. Вы собираете свое приложение, нажимаете кнопку и проверяете, соответствует ли полученный результат вашим ожиданиям. Достаточно часто в приложении можно встретить формочки с кнопкой “Test it” или классы с названием TestController или MyServiceTestClient.



То что вы делаете, называется интеграционным тестированием. Современные приложения достаточно сложны и содержат множество зависимостей. Интеграционное тестирование проверяет, что несколько компонентов системы работают вместе правильно.

Оно выполняет свою задачу, но сложно для автоматизации. Как правило, тесты требуют, чтобы вся или почти вся система была развернута и сконфигурирована на машине, на которой они выполняются. Предположим, что вы разрабатываете web-приложение с UI и веб-сервисами. Минимальная комплектация, которая вам потребуется: браузер, веб-сервер, правильно настроенные веб-сервисы и база данных. На практике все еще сложнее. Разворачивать всё это на билд-сервере и всех машинах разработчиков?

We need to go deeper
Total votes 70: ↑63 and ↓7+56
Comments65

Отличия сетевых вызовов Windows и Linux

Reading time4 min
Views21K
image
Во многом совместимые на уровне исходных кодов модели сокетов от Berkeley и Microsoft, на практике оказываются не такими уж кросплатформенными.

Рассмотрим некоторые хитрые различия в их реализации, которые обнаружились при написании кросплатформенного RPC для перенаправления сетевых вызовов некоторого процесса в одной ОС на другую ОС.
Читать дальше →
Total votes 23: ↑23 and ↓0+23
Comments2

Настройка отступов в VIM

Reading time2 min
Views70K
Процесс смены Komodo IDE на VIM я начал с изучения всевозможных туториалов и хау ту, однако, что удивительно, ни в одном из них мне не удалось встретить человеческого описания процесса настройки отступов. В одних предлагали регулировать ширину отступа с помощью опции tabstop, в других — с помощью softtabstop, в третьих — выставлять и то и другое и shiftwidth в придачу. После нескольких часов экспериментов с настройками я понял, что единственный способ не только заставить все работать, но и понять, почему оно работает — читать документацию. Своими «открытиями» я и хочу с вами поделиться.
Читать дальше →
Total votes 43: ↑37 and ↓6+31
Comments39

Switch для строк в C++11

Reading time6 min
Views90K
К сожалению, стандарт C++ не допускает применения операторов switch-case к строковым константам. Хотя в других языках, вроде C#, такая возможность имеется прямо «из коробки». Поэтому, понятное дело, многие C++ программисты пытались написать свою версию «switch для строк» — и я не исключение.
Для C++03 решения не отличались красотой и лишь усложняли код, дополнительно нагружая приложение в рантайме. Однако с появлением C++11 наконец-то появилась возможность реализовать такой код:

   std::string month;
   std::string days;

   std::cout << "Enter month name: ";
   std::cin  >> month;

   SWITCH (month)
   {
   CASE("february"):
       days = "28 or 29";
       break;

   CASE("april"):
   CASE("june"):
   CASE("september"):
   CASE("november"):
       days = "30";
       break;

   CASE("january"):
   CASE("march"):
   CASE("may"):
   CASE("july"):
   CASE("august"):
   CASE("october"):
   CASE("december"):
       days = "31";
       break;

   DEFAULT:
       days = "?";
       break;
   }

   std::cout << month << " has " << days << " days." << std::endl;

Реализация этой конструкции весьма проста. Она основана на constexpr-функциях из C++11, благодаря чему почти все вычисления производятся ещё на этапе компиляции. Если кого-то интересуют её детали, добро пожаловать под кат — благо на Хабре о «switch для строк» почему-то ничего не сказано.
Если кому интересно
Total votes 62: ↑56 and ↓6+50
Comments52

Эмиграция в Польшу как студент либо как фрилансер

Reading time11 min
Views195K
Прокомментировав хорошую статью IT-эмиграция в самое сердце Европы, в Словакию я получил сразу же много писем по внутренней почте хабра с вопросами по этому поводу, и с просьбами рассказать подробнее. Увидев такой ажиотаж, решил что не будет лишним попробовать расписать подробно для широкой аудитории.
Так как я переезжал вместе с девушкой, которая ехала сюда учиться на магистратуру, то у меня есть возможность описать оба способа переезда, вместе с подводными камнями с которыми мы сталкивались. Таким образом статья разделена на 2 части — переезд фрилансера, и переезд на учебу.
Читать их полностью
Total votes 100: ↑82 and ↓18+64
Comments150

Миникомпьютер из роутера с OpenWRT: разрабатываем USB-видеокарту

Reading time25 min
Views184K

Добрый день, уважаемые хабровчане. В этом цикле статей мы с вами пройдем достаточно длинный, но весьма интересный путь по превращению обычного роутера в мини-компьютер с LCD-дисплеем. Для этого мы разработаем сначала USB-видеокарту на базе микроконтроллера STM32F103, потом тестовый драйвер, который позволит нам выводить на него графику, и, наконец – полноценный драйвер фреймбуффера, благодаря которому можно будет запустить настоящие графические приложения, такие как x-сервер. Заодно мы научимся включать наш код в дерево исходников OpenWRT, допиливать его ядро и делать прочие полезные вещи.
Ну а в самом конце мы получим результат, который, я надеюсь, вызовет ностальгическую слезу у многих читателей. Я постараюсь излагать материал таким образом, чтобы в конце каждого этапа мы получали осязаемый результат, не дающий угаснуть энтузиазму. Итак, начнем.
Читать дальше →
Total votes 286: ↑279 and ↓7+272
Comments44

Information

Rating
Does not participate
Location
Украина
Date of birth
Registered
Activity