<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5014176727609086329</id><updated>2024-09-02T11:06:35.248+03:00</updated><category term="RU"/><category term="C++"/><category term="C"/><category term="C#"/><category term="Dr. Dobb&#39;s"/><category term="Herb Sutter"/><category term="Java"/><category term="algorithm"/><category term="concurrent"/><category term="lock-free"/><category term="nonblocking"/><category term="parallel"/><category term="queue"/><category term="translation"/><category term="ATmega64"/><category term="AVR"/><category term="IAR"/><category term="MSVC"/><category term="assert"/><category term="make"/><category term="printf"/><category term="ANSI"/><category term="Active Perl"/><category term="CWE/SANS"/><category term="DBD-Pg"/><category term="DSP"/><category term="DVCS"/><category term="EN"/><category term="FM"/><category term="ISO 13818"/><category term="MPEG2 TS"/><category term="Postgresql"/><category term="Runtime Error R6034"/><category term="Software Errors"/><category term="Ubuntu"/><category term="__flash"/><category term="__monitor"/><category term="alternatives"/><category term="autotools"/><category term="boost"/><category term="breakpoint"/><category term="build"/><category term="clib"/><category term="deb"/><category term="debug"/><category term="demux"/><category term="easy_install"/><category term="example"/><category term="exception"/><category term="floating point"/><category term="git"/><category term="google"/><category term="gstreamer"/><category term="invite"/><category term="msvcr80.dll"/><category term="mux"/><category term="note"/><category term="opensource"/><category term="package"/><category term="python"/><category term="random"/><category term="remux"/><category term="throw"/><category term="wave"/><category term="УКВ-ЧМ"/><title type='text'>HounD&#39;s Blog</title><subtitle type='html'>Код должен быть ясным, алгоритм эффективным, а компилятор оптимизирующим.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-4046210746677078219</id><published>2011-09-09T17:52:00.000+04:00</published><updated>2011-09-14T15:55:58.010+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DSP"/><category scheme="http://www.blogger.com/atom/ns#" term="FM"/><category scheme="http://www.blogger.com/atom/ns#" term="УКВ-ЧМ"/><title type='text'>А вы знаете как работает FM приёмник?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Все очень просто.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZS0ZzmgJxsOXvKNbOuc5uRVFioibeaJ0AYyLo2-o05MeYb9cB_uy3y5jdCbpQsRZHXtCTGFVgI2gIp3vHGqpvFJ6JftEYdvF7IZYZdG03ZHSqDZIkRhU2DTnXZhvJMTU3xOOa1HDSuQ/s1600/fm.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZS0ZzmgJxsOXvKNbOuc5uRVFioibeaJ0AYyLo2-o05MeYb9cB_uy3y5jdCbpQsRZHXtCTGFVgI2gIp3vHGqpvFJ6JftEYdvF7IZYZdG03ZHSqDZIkRhU2DTnXZhvJMTU3xOOa1HDSuQ/s640/fm.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Желающие экспериментов могут начать с &lt;a href=&quot;https://github.com/HounD/stereofmtransmitter&quot;&gt;этого&lt;/a&gt;.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/4046210746677078219/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/4046210746677078219' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4046210746677078219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4046210746677078219'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2011/09/fm.html' title='А вы знаете как работает FM приёмник?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZS0ZzmgJxsOXvKNbOuc5uRVFioibeaJ0AYyLo2-o05MeYb9cB_uy3y5jdCbpQsRZHXtCTGFVgI2gIp3vHGqpvFJ6JftEYdvF7IZYZdG03ZHSqDZIkRhU2DTnXZhvJMTU3xOOa1HDSuQ/s72-c/fm.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-6141889054447746472</id><published>2011-08-16T12:47:00.005+04:00</published><updated>2011-09-14T15:57:47.570+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="assert"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="CWE/SANS"/><category scheme="http://www.blogger.com/atom/ns#" term="debug"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="Software Errors"/><title type='text'>Боевой отладочный косинус</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Операции с использованием размера буфера
 (копирование, перемещение, и т.п.) традиционно являются больным местом 
всех и всея и занимают почетные первый места в рейтинге самых 
распространённых багов &lt;a href=&quot;http://www.sans.org/top25-software-errors&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;http://cwe.mitre.org/top25/&quot;&gt;2&lt;/a&gt;. Ну и мы как все. Редкий код взлетает без отладки подобных вещей.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Как-то исторически так сложилось, и 
возможно в связи со спецификой решаемых задач, что наилучшим и наиболее 
быстрым (а иногда и единственным) способом отладки является заполнение 
буфера непрерывным гармоническим сигналом, в простонародье косинусом 
(некоторые говорят, что значения синуса подходят куда более лучше, но 
мы-то же знаем кто на самом деле прав).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Дальнейшие действия думаю понятны. 
Исследуемый код дополняется правильной инициализацией буферов, потом 
следуют обычные манипуляции, отладка которых и есть наша цель, ну по их 
завершению или в любой произвольно выбранной контрольной точке 
содержимое буфера скидывается в файл и анализируется (например глазами в
 Origin).&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdtuE8XvW5ODnnDKEDGzU5RsgdCvr2bzWds179gVT2vjFuDAoxKjGStoQvp0P2Yy0qvbB3FVtdYhRkjOqorv3ugMW_Roqw2sNMx22PzQCbvje-QHmmjapeX8Lzx-MTFVi0ol6tTXUfGw/s1600/pic1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;205&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdtuE8XvW5ODnnDKEDGzU5RsgdCvr2bzWds179gVT2vjFuDAoxKjGStoQvp0P2Yy0qvbB3FVtdYhRkjOqorv3ugMW_Roqw2sNMx22PzQCbvje-QHmmjapeX8Lzx-MTFVi0ol6tTXUfGw/s400/pic1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Пример весьма запущенного случая&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ну и как резюме сказанного кратко плюсы метода:&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;в буфере находится некие осмысленные данные, а не не инициализированный мусор или нули;&lt;/li&gt;
&lt;li&gt;ошибки обрыва, наложения буферов хорошо видны при анализе в Origin;&lt;/li&gt;
&lt;li&gt;возможна автоматизация поиска редких ошибок. Вычисляя значение производной возможно по резкому скачку определить место разрыва.&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Из минусов можно отметить только прижившийся для этих целей Origin, еще 
то глюкало, которое ни как не хватает времени заменить самописным кодом 
на Python, например.&lt;br /&gt;
&lt;br /&gt;
Update: Частично Origin можно заменить &lt;a href=&quot;http://kst-plot.kde.org/&quot;&gt;Kst&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/6141889054447746472/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/6141889054447746472' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/6141889054447746472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/6141889054447746472'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2011/08/blog-post.html' title='Боевой отладочный косинус'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdtuE8XvW5ODnnDKEDGzU5RsgdCvr2bzWds179gVT2vjFuDAoxKjGStoQvp0P2Yy0qvbB3FVtdYhRkjOqorv3ugMW_Roqw2sNMx22PzQCbvje-QHmmjapeX8Lzx-MTFVi0ol6tTXUfGw/s72-c/pic1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-3653476648437609716</id><published>2011-08-05T11:43:00.004+04:00</published><updated>2011-08-25T11:17:01.699+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="demux"/><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer"/><category scheme="http://www.blogger.com/atom/ns#" term="ISO 13818"/><category scheme="http://www.blogger.com/atom/ns#" term="MPEG2 TS"/><category scheme="http://www.blogger.com/atom/ns#" term="mux"/><category scheme="http://www.blogger.com/atom/ns#" term="opensource"/><category scheme="http://www.blogger.com/atom/ns#" term="remux"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>Опенсоурса для мультиплексирования MPEG2 TS нет</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Тоесть совсем никак. Вроде бы и задача с первого взгляда не ахти какая сложная, но увы и ах.

Существующий в недрах gst-plugins-bad mpegtsmux и mpegtsdemux непригодены к использованию более чем польностью.

&lt;pre class=&#39;brush: bash&#39;&gt;gst-launch -v --gst-debug-level=2 mpegtsmux name=mux ! filesink location=./test.ts filesrc location=./ts1.ts ! mpegtsdemux ! mux. filesrc location=./ts2.ts ! mpegtsdemux ! mux.
&lt;/pre&gt;

вываливается с ошибкой, ничего при это не делая.

Господа из http://www.fluendo.com разродильсь собственным плагином к gstreamer&#39;у. Брать тут https://core.fluendo.com/gstreamer/svn/ (правда любезно пролюбили из собственного же svn libtsmux, который нашелся только тут: https://launchpad.net/ubuntu/+source/libtsmux/0.3.0-1)

Но, при этом

&lt;pre class=&#39;brush: bash&#39;&gt;
gst-launch -v --gst-debug-level=2 flutsmux name=mux ! filesink location=./test.ts filesrc location=./ts1.ts ! flutsdemux ! mux. filesrc location=./ts2.ts ! flutsdemux ! mux.
&lt;/pre&gt;

мультеплексирует все в однe программу, т.е. MPTS не умеет. Вычеркиваем.

FFmpeg со своим мультиплексором от flutsmux ушел совсем недалеко, максимум что можно им сотворить - однопрограммный мультиплекс, с выбором из разных источников звука/видео.

Есть правда загадочный TsRemux http://www.m2ts.org/util/tsremux http://forum.doom9.org/showthread.php?t=125447 писаный на C#, но по причине отсутсвия знакомства с этим самым # пришлось оставить его в стороне (хотя некоторые российские умельцы разобрались и похоже успешно его продают).

UP: Обнаружен http://www.scara.com/~schirmer/o/mplex13818/, на сколько функционален, пока не проверялось.

UPP: Функциональность mplex13818 вроде соответствует заявленной, но есть проблемы с воспроизведением полученного 2-х программного потока в VLC. Пока нет времени разбираться в причинах, но на всякий слкчай утащил к себе на &lt;a href=&quot;https://github.com/HounD/mplex13818&quot;&gt;github&lt;/a&gt; что бы не потерялось. Вообще если заработает как надо, было бы неплохо сделать из него полноценный плагин к gstreamer.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/3653476648437609716/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/3653476648437609716' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3653476648437609716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3653476648437609716'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2011/08/mpeg2-ts.html' title='Опенсоурса для мультиплексирования MPEG2 TS нет'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-3698878930194156446</id><published>2011-03-01T10:45:00.002+03:00</published><updated>2011-03-01T10:54:51.119+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="alternatives"/><category scheme="http://www.blogger.com/atom/ns#" term="autotools"/><category scheme="http://www.blogger.com/atom/ns#" term="build"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="DVCS"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="make"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Точка роста</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Похоже накопилась какая-то критическая масса опыта, позволяющая сделать качественный скачёк вперёд. Я имею ввиду технологии, или даже скорее инструментарий разработки. Git хорош, правда переворачивает мозг. В исполении &lt;a href=&quot;https://github.com/&quot;&gt;github.com&lt;/a&gt; так вообще (пока) предел мечтаний; &lt;a href=&quot;http://docs.python.org/distutils/setupscript.html&quot;&gt;setup.py&lt;/a&gt; - весьма элегантно и ненапряжно для малых проектов. &lt;a href=&quot;http://www.scons.org/&quot;&gt;SCons&lt;/a&gt; после беглого знакомства вдохновляет отказатся от этой тяжеловесной мути Autotools &amp;amp; Co. Где подвох?&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/3698878930194156446/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/3698878930194156446' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3698878930194156446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3698878930194156446'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2011/03/blog-post.html' title='Точка роста'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-1448374583486288932</id><published>2010-10-22T17:25:00.008+04:00</published><updated>2011-03-01T10:55:09.606+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deb"/><category scheme="http://www.blogger.com/atom/ns#" term="easy_install"/><category scheme="http://www.blogger.com/atom/ns#" term="make"/><category scheme="http://www.blogger.com/atom/ns#" term="package"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Главное - чистота и порядок!</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Возвращаюсь. Буду писать (надеюсь) всякие мелочи, возникающие по ходу. Вот сегодня вспоминал, и не вспомнил :). Нашлось в гугле естественно.&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Для того, чтобы всякое нестандартное не расползалось по системе есть &lt;a href=&quot;https://help.ubuntu.com/community/CheckInstall&quot;&gt;CheckInstall&lt;/a&gt;. Просто и надежно, например:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;sudo checkinstall make install_package&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/1448374583486288932/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/1448374583486288932' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/1448374583486288932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/1448374583486288932'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2010/10/blog-post.html' title='Главное - чистота и порядок!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-3690450684086776128</id><published>2010-05-26T10:45:00.006+04:00</published><updated>2010-05-27T06:51:32.636+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="floating point"/><category scheme="http://www.blogger.com/atom/ns#" term="MSVC"/><category scheme="http://www.blogger.com/atom/ns#" term="printf"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>Howto print floating point numbers quickly.</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Совершенно неожиданно столкнулся с тем, что вывод (печать) чисел с плавающей точкой дорогая операция. Замеров не проводил, объективных данных нет, но по тому что выдает гугл видно, что проблема действительно существует. Выход простой - определиться с точностью и выводить отдельно целую и дробную части как целые. Ну и ссылка для тех что хочет &lt;a href=&quot;https://docs.google.com/fileview?id=0B0m9xE8CFXzyYTQ3ZDc0YTktOTUyOS00YzJkLWIwMTctMzBmNWY2MGZlYTU0&amp;amp;hl=en&quot;&gt;углубиться&lt;/a&gt; (сорри, не помню где нашел).&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/3690450684086776128/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/3690450684086776128' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3690450684086776128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3690450684086776128'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2010/05/howto-print-floating-point-numbers.html' title='Howto print floating point numbers quickly.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-1858934599254895518</id><published>2009-11-30T15:54:00.004+03:00</published><updated>2009-11-30T16:04:49.350+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="invite"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="wave"/><title type='text'>Google Wave инвайты</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Порядком поднадоела эта суета сует вокруг распухающего гиганта. И я, наверное, один из немногих, кто не испытавает хоть какого-то восторга от нового сервиса. Посему предлагаю: в обмен на дозу вау-эффекта отдаю инвайты. Тот, кому они нужны, навярняка знает, зачем они ему ;) . Ничего не жалко, усё отдам.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/1858934599254895518/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/1858934599254895518' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/1858934599254895518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/1858934599254895518'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/11/google-wave.html' title='Google Wave инвайты'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-2626408473037932044</id><published>2009-09-07T09:38:00.005+04:00</published><updated>2009-09-07T09:54:53.446+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="boost"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="EN"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="note"/><category scheme="http://www.blogger.com/atom/ns#" term="random"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>Boost::normal_distribution example</title><content type='html'>&lt;div style=&quot;text-align: right; font-style: italic;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Этот пост для больших любителей типа меня читать документацию по диагонали десять раз одно и то же не замечая искомого, ну и себе в записную книжку естественно ;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;&quot;&gt;&lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// create the random number generator N(0,0.1) &lt;/span&gt;&lt;br /&gt;boost::mt19937 randomness;&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;typedef&lt;/span&gt; boost::normal_distribution&amp;lt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;double&lt;/span&gt;&gt; dist_type;&lt;br /&gt;dist_type norm_dist(0.0, 0.1);&lt;br /&gt;boost::variate_generator&amp;lt; boost::mt19937, dist_type &gt; noise(randomness,&lt;br /&gt;norm_dist);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;noise()&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Подсмотрел &lt;a href=&quot;http://www.terborg.net/research/kml/tutorial.html&quot;&gt;здесь.&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/2626408473037932044/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/2626408473037932044' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2626408473037932044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2626408473037932044'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/09/boostnormaldistribution-example.html' title='Boost::normal_distribution example'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-2610927263018695126</id><published>2009-08-08T10:54:00.006+04:00</published><updated>2009-08-20T22:48:57.313+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="assert"/><category scheme="http://www.blogger.com/atom/ns#" term="breakpoint"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><title type='text'>Assert vs Breakpoint</title><content type='html'>&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt;Иногда возникают микро-мысли, которые кому-то могут показаться чересчур прозрачными, а для кого-то могут быть полезны. Пусть будут, авось пригодятся.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Последнее время заметил одну особенность, возникла она как-то сама собой, но потом, стала очевидно простой и понятной. Я как-то совершенно внезапно перестал пользоваться точками останова в процессе отладки кода. Не скажу, что до этого я пользовался ими часто, как правило первое что я делал, начиная разбираться в незнакомом и/или некорректно работающем коде - искал возможность воспользоваться существующими в проекте средствами журналирования или встроить свои собственные (элементарный stdout меня как правило более чем устраивал).&lt;br /&gt;И вот разбираясь в новом коде, практически на автомате пишу.. assert(0). Оказалось, такой подход, по крайней мере лично для меня, имеет некоторые преимущества:&lt;br /&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot;&gt;&lt;li&gt;полностью сохраняется модель отладки приложения: расстановка точек останова, запуск, пошаговое выполнение;&lt;/li&gt;&lt;li&gt;возможность в явной форме записать условие продолжения выполнения (инвариант) кода;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;особо важные утверждения относительно корректности выполнения кода могут служить основой написания тестов и/или проверок корректности данных.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Второй пункт возможно расценивать и таким образом -  использование assert(..) вместо точек останова принуждает к более осмысленному поведению: формулировка гипотезы, эксперимент, анализ результатов.&lt;br /&gt;&lt;br /&gt;Последние пункты важны еще и тем, что позволяют не отходить от стратегии прагматичной автоматизации(сборки, построения, тестирования) проекта.&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/2610927263018695126/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/2610927263018695126' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2610927263018695126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2610927263018695126'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/08/assert-vs-breakpoint.html' title='Assert vs Breakpoint'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-4057492711186559893</id><published>2009-04-30T19:02:00.004+04:00</published><updated>2009-04-30T23:31:40.207+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="concurrent"/><category scheme="http://www.blogger.com/atom/ns#" term="Dr. Dobb&#39;s"/><category scheme="http://www.blogger.com/atom/ns#" term="Herb Sutter"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="lock-free"/><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><category scheme="http://www.blogger.com/atom/ns#" term="queue"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="translation"/><title type='text'>Алгоритм параллельной очереди. Часть 4. Полностью не блокирующая очередь для нескольких поставщиков и потребителей.</title><content type='html'>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение перевода &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt;статьи &lt;a href=&quot;http://www.ddj.com/cpp/211601363&quot;&gt;&quot;Writing a Generalized Concurrent Queue&quot;  by &lt;em&gt;&lt;/em&gt;Herb Sutter.&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Начало: &lt;/span&gt;&lt;a style=&quot;font-style: italic;&quot; href=&quot;http://houndsblog.blogspot.com/2009/04/1.html&quot;&gt;Алгоритм параллельной очереди. Часть 1. Множество поставщиков и потребителей.&lt;/a&gt; &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/2.html&quot;&gt;Алгоритм параллельной очереди. Часть 2. Очередь с двумя блокировками.&lt;/a&gt; &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/3.html&quot;&gt;Алгоритм параллельной очереди. Часть 3. Поставщик и потребитель.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Код, приведенный ранее, все еще использует две блокировки, хотя и умеренно. Что позволит нам реализовать полностью не блокирующую очередь, которую смогут использовать несколько поставщиков и потрбителей одновременно? Для заинтригованных, готовых разобраться в тонкостях и деталях читателей, приведу ссылки на две ключевые работы, заслуживающие внимания.&lt;br /&gt;&lt;br /&gt;В 1996 г. Michael и Scott опубликовали работу (&lt;a href=&quot;http://www.google.ru/url?sa=U&amp;amp;start=1&amp;amp;q=http://www.research.ibm.com/people/m/michael/podc-1996.pdf&quot;&gt;M. Michael and M. Scott. &quot;Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms&quot;&lt;/a&gt;), описывющую два варианта реализации очереди с внутренней синхронизацией. Один из вариантов действительно не блокирующий, другой использует блокировку для поставщиков и еще одну для потребителей, подобно примеру в статье. В 2003 Herlihy, Luchango и Moir показали на проблемы масштабируемости в подходе Michael и Scott представили свою собственную реализацию без блокировок (&lt;a href=&quot;http://www.cs.brown.edu/people/mph/HerlihyLM03/main.pdf&quot;&gt;M. Herlihy, V. Luchango and M. Moir. &quot;Obstruction-Free Synchronization: Double-Ended Queues As an Example&quot;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Особенностью описанных подходов является необходимость использования операции  сравнить-и-обменять двойной ширины (так же известной как &quot;DCAS&quot;), способной обрабатывать указатель и целый счетчик атомарно. Это достаточно проблемтично, потому что не все платформы имеют операцию DCAS, особенно широко распространенные процессоры, которым потребуется к тому же 128 битный CAS (&lt;span style=&quot;font-size:85%;&quot;&gt;Мы можем заставить это заработать и для 64 бит через героические попытки исхитриться  обокрасть 64 битное пространство, допуская, что  большинсво операционных систем сегодня на самом деле не используют все 64 бита  адреса  и возможно удасться  ухватить пару-тройку битов не заметно.  Тем не менее это крайне хрупкое и непортируемое решение, и нет гарантий что и другим людям, тем же разработчикам вашей ОС, не пришла в голову идея умыкнуть пару бит в этом бешенном 64 битном мире, и гонка за них уж началась. В действительности, провернуть подобный трюк вам удасться только если операционная система это вы, ну или ваш лучший друг)&lt;/span&gt;. В дополнение, потребуется и корректно работающий инициализатор пустого списка.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Это была завершающая часть статьи. Буду очень рад, если данный перевод тем или иным образом помог вам или натолкнул на какие-то мысли. В дальнейшем я планирую продолжать практику перевода статей. Возможно, кому-то может показаться что я понапрасну трачу время, потому что знание английского языка для программиста является  самим собой разумеющимся, но таким образом мне хотелось бы попробовать сформировать традицию рускоязычного профессионального журнала, так и не появившегося за все это время.&lt;br /&gt;Оставайтесь на линии ;)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/4057492711186559893/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/4057492711186559893' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4057492711186559893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4057492711186559893'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/4.html' title='Алгоритм параллельной очереди. Часть 4. Полностью не блокирующая очередь для нескольких поставщиков и потребителей.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-8864841779432210229</id><published>2009-04-23T20:15:00.005+04:00</published><updated>2009-04-30T23:34:01.092+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="concurrent"/><category scheme="http://www.blogger.com/atom/ns#" term="Dr. Dobb&#39;s"/><category scheme="http://www.blogger.com/atom/ns#" term="Herb Sutter"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="lock-free"/><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><category scheme="http://www.blogger.com/atom/ns#" term="queue"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="translation"/><title type='text'>Алгоритм параллельной очереди. Часть 3. Поставщик и потребитель.</title><content type='html'>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение перевода &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt;статьи &lt;a href=&quot;http://www.ddj.com/cpp/211601363&quot;&gt;&quot;Writing a Generalized Concurrent Queue&quot;  by &lt;em&gt;&lt;/em&gt;Herb Sutter.&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Начало: &lt;/span&gt;&lt;a style=&quot;font-style: italic;&quot; href=&quot;http://houndsblog.blogspot.com/2009/04/1.html&quot;&gt;Алгоритм параллельной очереди. Часть 1. Множество поставщиков и потребителей.&lt;/a&gt; &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/2.html&quot;&gt;Алгоритм параллельной очереди. Часть 2. Очередь с двумя блокировками.&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: right; font-style: italic;&quot;&gt;Поставщик.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Рассмотрим первый из двух основных методов: &lt;span style=&quot;font-style: italic;&quot;&gt;Produce&lt;/span&gt;. Задача состоит в том, что бы позволить им работать на столько параллельно, на сколько возможно:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;void&lt;/span&gt; Produce(&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;const&lt;/span&gt; T&amp;amp; t) {&lt;br /&gt; Node* tmp = new Node(new T(t));&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;  while&lt;/span&gt; (producerLock.exchange(true)) { }    &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// вход в критическую секцию&lt;/span&gt;&lt;br /&gt; last-&gt;next = tmp;                          &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// добавить потребителям&lt;/span&gt;&lt;br /&gt; last = tmp;                                &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// двигаем указатель&lt;/span&gt;&lt;br /&gt; producerLock = false;                      &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// выход из критической секции&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Во-первых, мы хотим выполнить как можно больше вне критической части кода, обновляющего очередь. В этом случае мы сможем выполнять выделение и коструирование узла и его значения одновременно, вне зависимости от числа поставщиков и потребителей.&lt;br /&gt;&lt;br /&gt;Во-вторых, мы &quot;применяем&quot; изменения, получая исключительный доступ к хвосту очереди. В цикле &lt;span style=&quot;font-style: italic;&quot;&gt;while&lt;/span&gt; мы пытаемся поменять &lt;span style=&quot;font-style: italic;&quot;&gt;prodicerLock&lt;/span&gt;  в  true до тех пор, пока старое значение не было false; полученное старое значение true означает, что кто-то другой уже получил доступ в критическую секцию. Подобный цикл &lt;span style=&quot;font-style: italic;&quot;&gt;while&lt;/span&gt; можно прочесть как &quot;до тех пор, пока я не буду единственным, кто поменял значение &lt;span style=&quot;font-style: italic;&quot;&gt;prodicerLock&lt;/span&gt; из false в true&quot;. Потом мы можем обновить &lt;span style=&quot;font-style: italic;&quot;&gt;last-&gt;next&lt;/span&gt; и, собственно, сам &lt;span style=&quot;font-style: italic;&quot;&gt;last&lt;/span&gt;; это две различные операции доступа (записи) в память, которые не могут быть выполнены одновременно на большенстве процессоров без какой-либо блокировки. В завершении, мы устанавливаем &lt;span style=&quot;font-style: italic;&quot;&gt;producerLock&lt;/span&gt; в false, освобождая критическую секцию.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Потребитель&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Подобным же образом мы хотим поддерживать любое количество потоков, называемых Consume, и обеспечивать их выполнение параллельно на столько, на сколько это возможно. Во-первых, мы получаем исключительный доступ к голове очереди.&lt;/div&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;bool Consume(T&amp;amp; result) {&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;  while&lt;/span&gt;(consumerLock.exchange(true)) { }   &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// вход в критическую секцию&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Далее, мы получаем значение указателя next. Если он не нулевой, мы должны получить первое значение, но важно сократить пребывание в исключительной секции на столько, на сколько это возможно.&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;  Node* theFirst = first;&lt;br /&gt; Node* theNext = first-&gt;next;&lt;br /&gt;   &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;if&lt;/span&gt;(theNext != nullptr) {            &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// если очередь не пуста&lt;/span&gt;&lt;br /&gt;     T* val = theNext-&gt;value;          &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// взять&lt;/span&gt;&lt;br /&gt;     theNext-&gt;value = nullptr;         &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// узел&lt;/span&gt;&lt;br /&gt;     first = theNext;                  &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// подвинуть указатель&lt;/span&gt;&lt;br /&gt;     consumerLock = false;             &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// выйти из исключительной секции&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь, закончив манипуляции со списком, остальные поставщики могу продолжить свое выполнение, пока мы занимаемся копированием и очисткой в сторонке.&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;  result = *val;                &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// скопируем его обратно&lt;/span&gt;&lt;br /&gt; delete val;                   &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// удалим значение&lt;/span&gt;&lt;br /&gt; delete theFirst;              &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// и временный узел&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;return&lt;/span&gt; true;                  &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// сообщим об успешном завершении&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Иначе, нулевое значение theNext, означает, что список пуст и мы можем немедленно выйти из критической секции и вернуть код завершения.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;    consumerLock = false;            &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// выйдем из критической секции&lt;/span&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;return&lt;/span&gt; false;                    &lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// сообщим, что очередь пуста&lt;/span&gt;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение: &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/4.html&quot;&gt;Алгоритм параллельной очереди. Часть 4. Полностью не блокирующая очередь для нескольких поставщиков и потребителей.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/8864841779432210229/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/8864841779432210229' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8864841779432210229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8864841779432210229'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/3.html' title='Алгоритм параллельной очереди. Часть 3. Поставщик и потребитель.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-8595284833203767380</id><published>2009-04-21T15:49:00.008+04:00</published><updated>2009-04-22T09:51:18.749+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Active Perl"/><category scheme="http://www.blogger.com/atom/ns#" term="DBD-Pg"/><category scheme="http://www.blogger.com/atom/ns#" term="msvcr80.dll"/><category scheme="http://www.blogger.com/atom/ns#" term="Postgresql"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="Runtime Error R6034"/><title type='text'>&lt; offtopic &gt; Active Perl, DBD-Pg &lt; /offtopic &gt;</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Запишу сюда, что бы не забыть, только не спрашивайте зачем оно мне понадобилось ;).&lt;br /&gt;При использовании связки Active Perl и DBD-Pg возникают проблемы при установке последнего. Делать следует так:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ppm install http://pgfoundry.org/frs/download.php/1891/DBD-Pg-2.10.0-Perl5.10.ppd&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Должно поставиться, если проблемы, смотрите сюда: http://pgfoundry.org/projects/dbdpgppm/ у него там домик, ищите рабочую ссылку соответствующую вашей версии perl&#39;а. Далее. Качаете http://pgfoundry.org/frs/download.php/1851/msvcr80.zip, распаковываете туда где лежит ваш perl.exe&lt;br /&gt;&lt;br /&gt;Последний штрих. Все это работать не будет :). Копируете &lt;ваш perl&gt;\site\lib\auto\DBD\Pg\Pg.dll.manifest --&gt; &lt;ваш perl&gt;\bin\&lt;b&gt;perl.exe.manifest&lt;/b&gt; (внимание, переименуйте файл!).&lt;br /&gt;&lt;br /&gt;Подсмотрел &lt;a href=&quot;http://computerhelpforum.org/forum/guides/f70/installing_dbd_pg_on_windows/t21341.html&quot;&gt;здесь.&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/8595284833203767380/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/8595284833203767380' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8595284833203767380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8595284833203767380'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/active-perl-dbd-pg.html' title='&lt; offtopic &gt; Active Perl, DBD-Pg &lt; /offtopic &gt;'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-2505321889025521982</id><published>2009-04-16T20:21:00.010+04:00</published><updated>2009-04-23T21:35:55.507+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="concurrent"/><category scheme="http://www.blogger.com/atom/ns#" term="Dr. Dobb&#39;s"/><category scheme="http://www.blogger.com/atom/ns#" term="Herb Sutter"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="lock-free"/><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><category scheme="http://www.blogger.com/atom/ns#" term="queue"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="translation"/><title type='text'>Алгоритм параллельной очереди. Часть 2. Очередь с двумя блокировками.</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение перевода &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt;статьи &lt;a href=&quot;http://www.ddj.com/cpp/211601363&quot;&gt;&quot;Writing a Generalized Concurrent Queue&quot;  by &lt;em&gt;&lt;/em&gt;Herb Sutter.&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Начало: &lt;/span&gt;&lt;a style=&quot;font-style: italic;&quot; href=&quot;http://houndsblog.blogspot.com/2009/04/1.html&quot;&gt;Алгоритм параллельной очереди. Часть 1. Множество поставщиков и потребителей. &lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Базовой структурой данных для очереди выберем однонаправленный список. Для упрощения кода, поместим пограничный пустой элемент в начале очереди, таким образом, логически, первый элемент будет содержаться в узле фактически следующим за первым. Рис. 1 демонстрирует остояние пустой очереди, рис. 2 демонстрирует очередь из нескольких объектов.&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Каждый узел содержит указатель на объект &lt;span style=&quot;font-style: italic;&quot;&gt;T&lt;/span&gt; и поле дополнения.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;&lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;template&lt;/span&gt; &amp;lt;&lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;typename&lt;/span&gt; T&gt;&lt;br /&gt;&lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;struct&lt;/span&gt; LowLockQueue {&lt;br /&gt;  &lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;struct&lt;/span&gt; Node {&lt;br /&gt;      Node( T* val ) : value(val), next(nullptr) { }&lt;br /&gt;      T* value;&lt;br /&gt;      atomic&amp;lt;Node*&gt; next;&lt;br /&gt;      &lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;char&lt;/span&gt; pad[CACHE_LINE_SIZE - &lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;sizeof&lt;/span&gt;(T*)- &lt;span style=&#39;color:#7f0055; font-weight:bold; &#39;&gt;sizeof&lt;/span&gt;(atomic&amp;lt;Node*&gt;)];&lt;br /&gt;    };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Как и любая другая разделяемая переменная, указатель &lt;span style=&quot;font-style: italic;&quot;&gt;next&lt;/span&gt; должен быть защищен мьютексом, или, как здесь, объявлен атомарным (C++0x &lt;span style=&quot;font-style: italic;&quot;&gt;atomic&lt;&gt;&lt;/span&gt;, Java/.NET &lt;span style=&quot;font-style: italic;&quot;&gt;volatile&lt;/span&gt;). Поле дополнения, здесь, добавлено что бы гарантировано предупредить поадание двух узлов на одну линию кэша; на практике, в случае непустой очереди, попадание первого и последнего узла очереди на одну линию кэша отрицательно скажется на производительности, вызывая невидимое соперничество между потребителем и поставщиком. Несмотря на то, что дополнение структуры используется здесь и далее, ошибка в том, что мы перестраховываемся: каждый узел будет выделен в куче, что уже добавит накладные расходы распределителя памяти: выравнивание и служебную информацию, сыграющие роль дополнения. Если так, и если мы узнаем величину накладных расходов, мы сможем уменьшить наше внутреннее дополнение пропорционально, что бы размеры &lt;span style=&quot;font-style: italic;&quot;&gt;Node&lt;/span&gt; соответствовали размерам одной линии кэша.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://i.cmpnet.com/ddj/images/article/2008/0810/081001hs01_f1.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 554px;&quot; src=&quot;http://i.cmpnet.com/ddj/images/article/2008/0810/081001hs01_f1.gif&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;Рис. 1&lt;br /&gt;&lt;/div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://i.cmpnet.com/ddj/images/article/2008/0810/081001hs01_f2.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px; height: 259px;&quot; src=&quot;http://i.cmpnet.com/ddj/images/article/2008/0810/081001hs01_f2.gif&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;Рис. 2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Далее, переменные управления очередью:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;char&lt;/span&gt; pad0[CACHE_LINE_SIZE];&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// для потребителяа&lt;/span&gt;&lt;br /&gt;Node* first;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;char&lt;/span&gt; pad1[CACHE_LINE_SIZE - &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;sizeof&lt;/span&gt;(Node*)];&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// для синхронизации потребителей&lt;/span&gt;&lt;br /&gt;atomic&amp;lt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;bool&lt;/span&gt;&gt; consumerLock;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;char&lt;/span&gt; pad2[CACHE_LINE_SIZE - &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;sizeof&lt;/span&gt;(atomic&amp;lt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;bool&lt;/span&gt;&gt;)];&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// для поставщика&lt;/span&gt;&lt;br /&gt;Node* last;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;char&lt;/span&gt; pad3[CACHE_LINE_SIZE - &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;sizeof&lt;/span&gt;(Node*)];&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(63, 127, 89);&quot;&gt;// для синхронизации поставщиков&lt;/span&gt;&lt;br /&gt;atomic&amp;lt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;bool&lt;/span&gt;&gt; producerLock;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;char&lt;/span&gt; pad4[CACHE_LINE_SIZE - &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;sizeof&lt;/span&gt;(atomic&amp;lt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;bool&lt;/span&gt;&gt;)];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;И опять, мы добавляем дополнение что бы обеспечить раздельное положение данных различных потоков в памяти и кэше. Точнее, мы хотим обеспечить пложение данных поставщика и потребителя в различных линиях кэша, кроме того, даже если один поставщик и один потребитель будут активны, необходимо добиться что бы переменные блокировки находились отдельно, и потребители ожидающие &lt;span style=&quot;font-style: italic;&quot;&gt;consumerLock&lt;/span&gt; не влияли на линию кэша, содержащую &lt;span style=&quot;font-style: italic;&quot;&gt;first&lt;/span&gt;, которую обновляет активный потребитель, а поставщики, ожидающие &lt;i&gt;producerLock&lt;/i&gt;, не замедляли активного поставщик, обновляющего &lt;span style=&quot;font-style: italic;&quot;&gt;last&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Конструктор всего лишь инициализирует начальное пустое состояние, а деструктор (в .NET или Java, это выполнит сборщик мусора), проходит по внутреннему списку и и уничтожает элементы.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style=&quot;background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;&lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;LowLockQueue() {&lt;br /&gt; first = last = &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;new&lt;/span&gt; Node( nullptr );&lt;br /&gt; producerLock = consumerLock = &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;~LowLockQueue() {&lt;br /&gt; &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;while&lt;/span&gt;( first != nullptr ) {        &lt;br /&gt;   Node* tmp = first;&lt;br /&gt;   first = tmp-&gt;next;&lt;br /&gt;   &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;delete&lt;/span&gt; tmp-&gt;value;      &lt;br /&gt;   &lt;span style=&quot;color: rgb(127, 0, 85); font-weight: bold;&quot;&gt;delete&lt;/span&gt; tmp;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение: &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/3.html&quot;&gt;Алгоритм параллельной очереди. Часть 3. Поставщик и потребитель.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;/i&gt;&lt;h5&gt;&lt;em&gt;&lt;/em&gt;&lt;/h5&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/2505321889025521982/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/2505321889025521982' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2505321889025521982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/2505321889025521982'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/2.html' title='Алгоритм параллельной очереди. Часть 2. Очередь с двумя блокировками.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-8671087919986348491</id><published>2009-04-14T10:47:00.004+04:00</published><updated>2009-04-14T11:47:00.026+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ANSI"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="exception"/><category scheme="http://www.blogger.com/atom/ns#" term="MSVC"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="throw"/><title type='text'>Мы в Microsoft всегда считаем, что стандарт можно улучшить.</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Цитата, вынесенная в заголовок, уже стала крылатой (вот источник: &quot;Основы COM&quot; Дейл Роджерсон). И правда, могут...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Visual C++ departs from the ANSI Standard in its implementation of exception  specifications. The following table summarizes the Visual C++ implementation of  exception specifications:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;&lt;br /&gt;throw(type): The function can throw an exception of type type.  However, in Visual C++ .., this is interpreted as throw(...). (MSDN)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/8671087919986348491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/8671087919986348491' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8671087919986348491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8671087919986348491'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/microsoft.html' title='Мы в Microsoft всегда считаем, что стандарт можно улучшить.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-4516555087925511872</id><published>2009-04-09T21:09:00.005+04:00</published><updated>2009-04-16T23:05:19.068+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="concurrent"/><category scheme="http://www.blogger.com/atom/ns#" term="Dr. Dobb&#39;s"/><category scheme="http://www.blogger.com/atom/ns#" term="Herb Sutter"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="lock-free"/><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><category scheme="http://www.blogger.com/atom/ns#" term="queue"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><category scheme="http://www.blogger.com/atom/ns#" term="translation"/><title type='text'>Алгоритм параллельной очереди. Часть 1. Множество поставщиков и потребителей</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt;Вступление от переводчика. Позволю себе некоторое количество околофилософских замечаний перед десертом. В качестве же самого вкусного предлагаю Вашему вниманию попытку перевода-пересказа статьи &lt;a href=&quot;http://www.ddj.com/cpp/211601363&quot;&gt;&quot;Writing a Generalized Concurrent Queue&quot;  by &lt;em&gt;&lt;/em&gt;Herb Sutter.&lt;/a&gt; Первый номер Dr. Dobb&#39;s Journal попал мне в руки в далеком девяносто каком-то, наверное в&lt;/span&gt;&lt;span style=&quot;font-style: italic;font-size:85%;&quot; &gt; девяносто третьем. Тогда, на буме проникновния IT в Россию этот журнал даже издавали у нас в переводе. Кроме прочего, в каждом номере бумажного издания публиковлась статья с подробным разбором алгоритма. Вот она, та, самая первая, прочитанная мной статья: &lt;a href=&quot;http://www.ddj.com/architect/184408761&quot;&gt;&quot;Fletcher&#39;s Checksum&quot; by John Kodis&lt;/a&gt;. Ничего сверхъестественного, но это одна из тех вех, которая определила моё отношение к разработке эффективных алгоритмов. А именно: &lt;span style=&quot;font-weight: bold;&quot;&gt;соображения целесообразности должны определять выбор используемого решения.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Две блокировки и неплохой результат.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В прошлом месяце я показал код свободной от блокировок (lock-free) очереди, пригодной к использованию с некоторыми ограничениями, а именно, для случая двух нитей: одного поставщика и одного потребителя. Полезно, но может оказатся не таким интересным, после того, как пик ликования минует. В этом месяце давайте решим проблему множетва поставщиков и множества потребителей в общем виде, на столько, на сколько это можно сделать параллельно. Код в этой статье будем проектировать исходя из четырёх простых идей.&lt;br /&gt;&lt;br /&gt;Во-превых, мы будем использовать (эквивалент) двух блокировок: одной для управления поставщиками, другой, для управления потребителями. Кроме того, будем использовать атомарные переменные (C++0x &lt;span style=&quot;font-style: italic;&quot;&gt;atomic&lt;&gt;&lt;/span&gt;, Java/.NET &lt;span style=&quot;font-style: italic;&quot;&gt;volatile&lt;/span&gt;) напрямую, фактически реализуя цикл ожидания (spinlock), а не предоставляемые мютексы. Хотя это и означает, что алгоритм не полностью свободен от блокировок, тем не менее он позволяет множеству поставщиков и потребителей работать на столько одновременно, на сколько это возможно, минимизировав критический участок кода, обновляющий хвост и голову очереди.&lt;br /&gt;&lt;br /&gt;Во-вторых, мы будем выделять память под элементы &lt;span style=&quot;font-style: italic;&quot;&gt;T&lt;/span&gt; в куче и работать с указателями на них, а не их значениями. Опытному разработчику параллельных алгоритмом подход может показаться ошибочным с первого взгляда, потому как процесс выделения памяти может привести к необходимости дополнителного перераспределения, а это, как известно, узкое горлышко современных менеджеров памяти. На самом деле, даже в системах имеющих проблемы с мастабируемостью выделения памяти, перевешивают преимущества масштабируемости и параллельной работы нитей потребителей, потому что мы можем вынести фактическое копирование значения &lt;span style=&quot;font-style: italic;&quot;&gt;T&lt;/span&gt; за пределы кода, обновляющего разделяемые данные.&lt;br /&gt;&lt;br /&gt;Третье. Нам не хотелось бы делать поставщика ответственным за медленное удаление узлов, полученных потребителем с момента последнего его обращения, это отрицательно сказывается на производительности, добавляя гонку хвоста и головы и неоправданно задерживая освобождение узлов. Вместо этого ответственными за освобождение узлов сделаем конкретных потребителей, локализуя проблему.&lt;br /&gt;&lt;br /&gt;В четвертых, мы хотим выполнить рекомендации, позволяющие двум переменным, не защищенные одним мьютексов и доступные двум нитям попасть в различные линии кэша, избежав ложного обмена (&lt;span style=&quot;&quot; onmouseover=&quot;_tipon(this)&quot; onmouseout=&quot;_tipoff()&quot;&gt;ping-ponging&lt;/span&gt;), ограничивающего производительность. В нашем случае, мы хотим довиться, что бы различные узлы (в частности первый и последний), первый и последний указатели списка, переменные &lt;i&gt;producerLock&lt;/i&gt; и &lt;span style=&quot;font-style: italic;&quot;&gt;consumerLock&lt;/span&gt;, все они, попали в разные линии кэша.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Продолжение: &lt;a href=&quot;http://houndsblog.blogspot.com/2009/04/2.html&quot;&gt;Алгоритм параллельной очереди. Часть 2. Очередь с двумя блокировками.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;/i&gt;&lt;h5&gt;&lt;em&gt;&lt;/em&gt;&lt;/h5&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/4516555087925511872/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/4516555087925511872' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4516555087925511872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/4516555087925511872'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/1.html' title='Алгоритм параллельной очереди. Часть 1. Множество поставщиков и потребителей'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-3590997628387773804</id><published>2009-04-08T11:40:00.008+04:00</published><updated>2009-04-09T23:08:26.325+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="__flash"/><category scheme="http://www.blogger.com/atom/ns#" term="ATmega64"/><category scheme="http://www.blogger.com/atom/ns#" term="AVR"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="clib"/><category scheme="http://www.blogger.com/atom/ns#" term="IAR"/><category scheme="http://www.blogger.com/atom/ns#" term="printf"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>Гарвардская архитектура и реализация printf()</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;В то время пока космические корабли... да, они бороздять а я в очередной раз вылавливаю очередную багофичу из прошивки. Вроде бы на ровно месте споткнулся, но выводов можно сделать достаточно.&lt;br /&gt;&lt;br /&gt;Итак, потратив целый день на анализ кода различных вариаций printf() доступных в используемой clib (да, дизассемблер наш лучший друг)  можно сделать следующие заключения. В предлагаемой в комплекте с IAR clib нет реализации printf() корректно работающей, когда и строка форматирования и аргументы расположены во флеше. Выход один - копировать в локальный буфер и выводить (привет ребятам и Гарварда, да идея мухи(код) отдельно, котлеты(код) отдельно неплоха, но если заранее не известно чего будет больше данных или кода, то получаем костыли компилятора типа __flash, позполяющие располагать данные в сегменте кода, и при уданом стечении обстоятельст пробежимся по все памяти обязательно).&lt;br /&gt;&lt;br /&gt;Мысль следующая. Человеческая лень - неистребимое зло. Гораздо легче найти в интернете хрен знает какой код, чем почитать документаци. Вывод: если не хватает функционала, а самому писать лень или таланту не хватает, то следует использовать следующие варианты с понижением приоритета:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;стандартная библиотека&lt;/li&gt;&lt;li&gt;сторонние реализации (чем более распространена реализация, тем лучше)&lt;/li&gt;&lt;li&gt;все-таки писать самому и подружиться с отладчиком&lt;/li&gt;&lt;/ul&gt;Наконец, последнее.&lt;br /&gt;&lt;div style=&quot;text-align: right; font-style: italic;&quot;&gt;за это нужно гнать из профессии:&lt;br /&gt;#ifdef printf&lt;br /&gt;#undef printf&lt;br /&gt;#endif&lt;br /&gt;#define printf printf_P&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/3590997628387773804/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/3590997628387773804' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3590997628387773804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/3590997628387773804'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/printf.html' title='Гарвардская архитектура и реализация printf()'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-7902478438763392035</id><published>2009-04-01T10:14:00.011+04:00</published><updated>2009-04-09T23:13:27.762+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="__monitor"/><category scheme="http://www.blogger.com/atom/ns#" term="ATmega64"/><category scheme="http://www.blogger.com/atom/ns#" term="AVR"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="IAR"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>О пользе чтения документации, дизассамблирования и логических рассуждений.</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Видимо так будет получаться, что помимо статей, в блоге будет некоторое количество мимоходных заметок. Встречайте первую из них.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Так уж исторически случилось, что сейчас пишу под AVR, а точнее под ATmega64. Железка сама по себе интересная, с богатой переферией, но речь не об этом. Среда разработки IAR, компилятор их же. Это вводная, а теперь суть.&lt;br /&gt;&lt;br /&gt;Есть у IAR&#39;а некоторый набор расширений, для удобства, так сказать. Предметом разговора сегодня будет ключевое слово &lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;__monitor&lt;/span&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;.&lt;/span&gt; &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;Вот что нам говорит про него документация:&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;/span&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;The __monitor keyword causes interrupts to be disabled during execution of the function. This allows atomic operations to be performed, such as operations on semaphores that control access to resources by multiple processes. A function declared with the __monitor keyword is equivalent to any other function in all other respects.&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; (IAR C/C++ Compiler Reference Guide p. 210)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну что можно сказать, просто отлично, то что надо, кроме того, обещают:&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;A monitor function causes interrupts to be disabled during execution of the function. At function entry, the status register is saved and interrupts are disabled. At function exit, the original status register is restored, and thereby the interrupt status that existed before the function call is also restored.&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt; (IAR C/C++ Compiler Reference Guide p. 52)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;А дальше приводиться пример кода реализующего атомарную блокировку ресурса. Всё бы хорошо, но  не дайте себе обмануться. Может сложиться впечатление что по выходу из &lt;span style=&quot;font-style: italic;&quot;&gt;__monitor&lt;/span&gt; функции разрешает прерываия, но нет.&lt;br /&gt;&lt;br /&gt;Понять, что такое поведение было бы некорректно, просто. Предположим случай вложенного вызова одной &lt;span style=&quot;font-style: italic;&quot;&gt;__monitor&lt;/span&gt; функции &lt;span style=&quot;font-style: italic;&quot;&gt;foo()&lt;/span&gt; из другой &lt;span style=&quot;font-style: italic;&quot;&gt;__monitor&lt;/span&gt; функции &lt;span style=&quot;font-style: italic;&quot;&gt;bar()&lt;/span&gt;. Если бы по выходу из &lt;span style=&quot;font-style: italic;&quot;&gt;foo()&lt;/span&gt; прерывания разрешались, то остаток bar() выполнялся бы не эксклюзивно и мог быть прерван. Такое поведение не предполагалось нами при объявлении &lt;span style=&quot;font-style: italic;&quot;&gt;bar()&lt;/span&gt;.  Вызов не &lt;span style=&quot;font-style: italic;&quot;&gt;__monitor&lt;/span&gt; из &lt;span style=&quot;font-style: italic;&quot;&gt;bar()&lt;/span&gt; так же неоднозначен. Единственным разумным выходом оказалось не разрешать прерывания по выходу из &lt;span style=&quot;font-style: italic;&quot;&gt;__monitor&lt;/span&gt; функций, что и подтвердил дизассемблированный код.&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;&lt;/span&gt;Разработчики же документации на компилятор получают минус в карму за откровенный обман:&lt;span style=&quot;font-size:85%;&quot;&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;A monitor function causes interrupts to be disabled during execution of the function. At function entry, the status register SREG is saved and global interrupts are disabled. At function exit, the global interrupt enable bit (I) is restored in the SREG register, and thereby the interrupt status existing before the function call is also restored.&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;(IAR C/C++ Compiler Reference Guide p. 107)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Из всего этого можно сделать простой вывод, что&lt;br /&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;только критическая оценка и эксперимент дают адекватное представление о действительности.&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/7902478438763392035/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/7902478438763392035' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/7902478438763392035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/7902478438763392035'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/04/blog-post.html' title='О пользе чтения документации, дизассамблирования и логических рассуждений.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5014176727609086329.post-8280223709174187526</id><published>2009-03-28T13:16:00.006+03:00</published><updated>2009-04-09T23:22:48.214+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="RU"/><title type='text'>Начало</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;В то время, пока идеи статей потихоньку собираются мыслями в буквы, главная идея блога уже вполне оформилась.  Последнее время, занимаясь систематизацией своих знаний по такой богатой на различные мифы и разночтения теме как программирование на C++ столкнулся с тем, как слабо люди понимают тот инструмент, которым пользуются ежедневно. Знание правил несомненно приводит их к результату за конечное время, и на этом можно было бы остановиться, но к сожалению, такой подход не может использоваться для решения принципиально новых задач; такие знания не переходят из навыка в понимания и никогда не станут фундаментом нового знания. А все остальное просто. Помните,&lt;/div&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Код должен быть ясным, алгоритм эффективным, а компилятор оптимизирующим.&quot;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://houndsblog.blogspot.com/feeds/8280223709174187526/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5014176727609086329/8280223709174187526' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8280223709174187526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5014176727609086329/posts/default/8280223709174187526'/><link rel='alternate' type='text/html' href='http://houndsblog.blogspot.com/2009/03/blog-post.html' title='Начало'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09375218741863581585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>