C++: категории итераторов
Добротное разъяснение (кому непонятно это и это (ну и по ссылкам отсюда)) категорий итераторов на ru.SO:
Добротное разъяснение (кому непонятно это и это (ну и по ссылкам отсюда)) категорий итераторов на ru.SO:
Пост-вопрос.
Может кто объяснить, почему в стандарт вошла настолько обрезанная версия реализации std::thread
? Ведь предлагаемый интерфейс не предоставляет абсолютно никаких средств передачи параметров потоку в момент создания, к примеру, тот же размер стека, что крайне актуально на всяких RTOS. При этом Boost.Thread такую возможность предоставляют средствами [boost::thread::attributes](http://www.boost.org/doc/libs/1_60_0/doc/html/thread/thread_management.html#thread.thread_management.thread.attributes)
:
template <class F>
explicit thread(attributes& attrs, F f);
template <class F>
thread(attributes& attrs, F &&f);
template <class F, class ...Args>
explicit thread(attributes& attrs, F&& f, Args&&... args);
Средства хоть и лимитированные, но доступ к native_handle атрибута позволяют тюнить параметры на конкретной платформе. Но в стандартной библиотеке нет и их. Нипанимать. Explain. Explain.
PS libstdc++ зато предоставляет достаточно простые средства, что бы добавить поддержку своих потоков (на той же RTOS), не прибегая к модификации кода библиотеки (если кому интересно, могу на пальцах разбросать как, но без полной реализации).
Статью изначально опубликовал на Хабре: http://habrahabr.ru/post/274179/
Дано:
Проблема: устройство нужно отлаживать и писать под него код. И делать это, желательно, удобно.
Решение с использованием OpenOCD, GDB и Qt Creator, а так же описание пути к нему, под катом.
После экспериментов с роутером Zyxel Keenetic 4G II (прошил неофициальную прошивку серии V1 (V1.11.RU.NDMS), на родной серии V2 непредсказуемо работал multicast IPTV) заметил, что WiFi стал работать как-то нестабильно (затыки с сайтами, постоянный реконнект у мессенджеров). Временами, но стабильно, стал вылазить диалог с просьбой ввести пароль от точки. Будто бы порвалась связь и не получилось подключиться с какого-то количества попыток.
Размышляя, что менял (ну кроме самой прошивки), вспомнил, что я переключил WiFi с режима 11b/g на режим 11b/g/n (раньше прошивка читалки не могла цепляться, если AP в таком режиме, после прошивку исправили, а настройки так и остались). Действительно, когда я переключил роутер обратно в режим 11b/g, то всё стало на свои места, так что не прошивка виновата. Казалось бы - решение найдено, но такой путь - не наш метод (хотя… если ничто другое не помогает, то лучше синица в руках, чем журавль в небе).
Запоздалый пост. Краткое описалово может чуть позже (или никогда) накатаю, а фото вот:
https://picasaweb.google.com/116960244871002539190/102015
Сделал PPA, куда положил MinGW GCC 5: https://launchpad.net/~adrozdoff/+archive/ubuntu/mingw
Версия GCC на момент написания поста: 5.3.0. Сборка зависит от репозитория https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages (если надумаете собирать сами).
Краткие характеристики сборки:
Добавление репозитория: sudo apt-add-repository ppa:adrozdoff/mingw
Установка: sudo apt-get install gcc-5-mingw-w64 g++-5-mingw-w64
Компилятор с суффиксом -5
, что бы не конфликтовать с тем, что распространяется вместе с Ubuntu/Mint.
В этом же репозитории планирую выкладывать сборки библиотек.
Создать альтернативы:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 99
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 99
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 99
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 99
sudo update-alternatives --set c++ /usr/bin/g++
После чего можно переключаться вручную через меню:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
или скриптом:
sudo update-alternatives --set gcc /usr/bin/gcc-5
sudo update-alternatives --set g++ /usr/bin/g++-5
или вернуть в автоматический режим:
sudo update-alternatives --auto gcc
sudo update-alternatives --auto g++
Снести альтернативы:
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
Или только указанную:
sudo update-alternatives --remove gcc /usr/bin/gcc-4.9
sudo update-alternatives --remove g++ /usr/bin/g++-4.9
В последнем случае, подберётся другая альтернатива (на основе приоритета) и выбор будет выставлен в auto. Если альтернатив нет, то будут почищены все симлинки.
На основе: http://askubuntu.com/questions/26498/choose-gcc-and-g-version
Данная статья практически на 100% отражает и мой подход к использованию ссылок и указателей, рекомендую к ознакомлению:
http://eao197.blogspot.ru/2015/11/progthoughts-c.html
Тезисно:
void f(const T &p)
ожидает реально существующий объект, но не изменяет его;void f(T &p)
ожидает реально существующий объект и изменяет его;void f(const T *p)
ожидает объект или nullptr
, если объект существует, то не изменяет его;void f(T *p)
ожидает объект или nullptr
, если объект существует, то изменяет его;void f(unique_ptr<T> p)
ожидает объект или nullptr
; если объект существует, то забирает ответственность за его удаление;void f(shared_ptr<T> p)
ожидает объект или nullptr
; если объект существует, то разделяет владение этим объектом (что дает право функции f()
сохранить p
у себя для дальнейшего использования или передать кому-то еще).Как-то упустил сей момент:
Вообще FAQ стоит перечитать.
Если нужно сделать повторный стриминг небольшого файла (или просто сделать большой файл из нескольких повторов маленького), то поможет такая команда:
ffmpeg -re -f lavfi -i "movie=filename=/some/path/input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" -ar 44100 -f flv rtmp://some.server/app/live
Чуть подробнее:
-re
процессит входные фреймы так, как если бы это был live streamlavfi
говорит, что входной файл, это не регулярный файл, устройство или сетевой ресурс, а описание графа фильтра (комплексного)-i
становится описание графа фильтра:
1. movie
- фильтр задаёт источник данных, а его параметр loop=N
задаёт число повторов, 0 - бесконечное число раз, отличное от нуля - будет сделано именно такое число повторов.
2. setpts
- предыдущий фильтр действует принципу KISS: попросили повторять файл - буду, но PTS будет оставаться без модификаций, соответсвенно муксеру это может (и даже, скорее всего, обязательно) показаться неприятным. Соответственно нам нужно пересчитать PTS на основе прошедших (N
) кадров, фреймрейта (FRAME_RATE
) и time-base входного PTS (TB
, про time-base
я уже писал)Дальнейшие опции роли не играют и могут сильно варьироваться. Выходным файлом может быть что угодно. Проблемы могут быть с входными файлами с переменным фреймрейтом, но я таких не видел.
Продублировал как ответы на вопросы на сайта Stack Exchange: