• Игровые циклы или ЭлектроКардиоГама
    0
    кстати про аппроксимацию и интерполяцию. читал про игру Supreme Commander. там обсчет игрового состояния идет 10 раз в секунду всего. при этом фпс 60 рисует абсолютно плавное, и при этом анимированное движение. анимация вся явно в треде отображения. тред игросостояния
    я так полагаю, что тред отображения при этом всегда должен запаздывать. ибо ракета должна попасть в цель, что может произойти по времени между этими двумя игровыми отсчетами. и тред игросостояния собственно не просто следующее состояние" должен выдавать, а всю достаточную для аппроксимации информацию.
    и кстати игра утилизирует 2 треда.
  • Игровые циклы или ЭлектроКардиоГама
    +1
    наш рабочий проект создавался еще когда не было операционных систем, точнее они были, но их использование было неоправдано. а «многозадачность» нужна. я то тут не так давно, но вот с опухшими глазами смотрю на это.
    так вот, там реализован sched вот как раз по этому принципу, только более комплексно. очереди сообщений 2х-милисекундные, 20ти, 100. сам считает таймслайсы, и т.п.
    сейчас это все, причем существенно эффективнее делает операционная система. хоть линух, хоть винда дает возможности многозадачности другого порядка.
    собственно тут именно эта задача и стоит. два отдельных процесса — обработки состояния игры и ее отображения должны быть полностью независимы, чего собственно и добивается автор пытаясь абстрагировать механику игры от фпс.

    как мне кажется проще и правильнее сделать два треда. в одном updateGame, в другом displayGame. и соответственно первый второму через пайп скармливает данные для отображения.
    чем колхозить вот такую вот «двухзадачность», которая еще и при этом не сможет двухядерник даже напрячь.
  • И снова про сортировки: выбираем лучший алгоритм
    0
    вопрос такой — я правильно понял, 100млн рандомных интов quicksort сортирует за 35 секунд?
  • Отличная наглядная видеолекция о сущности SOPA/PIPA и возможных проблемах
    0
    Ясное дело. патентные войны для нас это просто цирк, а тут каждый пострадает, так или иначе.

    Я хотел сказать, что патентные тролли схватятся за этот инструмент, как за ману небесную…
  • Почему SOPA бесполезна
    0
    а мне кажется, что не так уж и мало. по крайней мере на сегодняшней стадии развития российского менталитета.

    я так skyrim купил. сначала поиграл — понравилось, пошел и купил.
    а не имея пиратки вряд ли бы все бросил и пошел деньги отдавать не глядя.

    и пару веток на форумах поперечитал — много кто пишет, что вот такая то бага появилась когда купил на лицензии, на пиратке не было. другие наоборот мучаются с багами на пиратках, потом сообщают, что купили лицензию, бага пропала.
  • Почему SOPA бесполезна
    0
    скорее лотки дисковые на горбушках опять заколосятся…
  • Отличная наглядная видеолекция о сущности SOPA/PIPA и возможных проблемах
    0
    ждем нового витка патентных войн:
    эппл подаст новый иск на самсунг — у них коробка от галакси того же цвета, что и наш айпад! нарушение авторских прав! кража интеллектуальной собственности! сайт самсунг перестанет находить гугл, в днсах потрется и т.п.
    на следующий день самсунг подаст иск, что айфоны используют запатентованные нами радиоволны, исчезнет сайт эппл.
  • Проблемы инкапсуляции
    0
    тоже как то сам на это набрёл.

    цель была сократить количество вызываемых методов, то бишь упростить код «бизнес-логики», в частности проверка не пуст ли лист, прежде чем выбирать элементы, в т.ч. чтоб ексепшен исключить в «нормальном» режиме, плюс встроил энумератор чтоб можно было foreach делать сразу с нужным типом. и т.п.
    к примеру XmlDocument так под себя затачивал.

    вобщем то мне кажется оно так и должно быть — исходные классы могут быть сколь угодно сложны и намудрены, и опять же каждый класс имеет свой вид «общения» с тем, кто его пользует.
    а тот, кто задумал пользовать эти классы, причем они могут быть все от разных разработчиков, с разными интерфейсами, просто пишет для них обертки в нужном ему виде, униформирует интерфейс, упрощает и т.п.
  • Я не знаю Си
    –1
    баг в чистом виде.
  • Я не знаю Си
    0
    а в стандарте то оказалось прямо написано чего это обозначает. к экстерну отношения не имеет.
    экстерн работает на уровне линкера. а неполное определение на уровне компилятора.
  • Я не знаю Си
    0
    итак, все встало на свои места.

    пример использования этой главы стандарта:
    файлы
    source1.c:
    int i = 10;

    source2.c:
    #include «source1.c»
    int i;

    source3.c
    #include «source2.c»
    int i;

    в момент компиляции файла source3.c все три файла представляют собой т.н. translation unit. (почитал, что это такое в этом стандарте).

    в файле source1.c — определение переменной с инициализацией, получается, что, понятия «объявление переменной» не существует. объявление(declaration) согласно стандарту есть только у функций.
    в файле source2.c — «неполное определение», которое использует int i=1; из файла source1.c как external (не навело это слово на мысль?)
    в файле source3.c такое же «неполное определение», которое также использует ту же переменную из source1.c (слова one or more как бы намекают, что неполное определение в файлах состоящих в translation unit, может присутствовать более одного раза).

    в случае, же если в файле source1.c определение переменной затереть, то подразумевается, что переменная i = 0 по умолчанию, и одна и та же для файлов source2.c и source3.c.

    смысл затеи понятен — прямо указать откуда заинклюдить все нужные определения.

    по примеру автора попрошу объяснить сакральный смысл зачем бы это могло быть использовано. «это» — два определения в пределах одного файла.
    и кстати даже интересно, каким образом это породило багу в коде?
    кто то увидел верхнее определение и подумал, что оно по умолчанию 0, а оно оказалось 10?

    ЗЫ и все таки баг компилятора.
  • Я не знаю Си
    –1
    если только воспринимать это как баг, который был в компиляторах си, и пофиксили по пути к внедрению с++. это не нормально.
  • Я не знаю Си
    0
    необозначенный int равен разрядности указателя, разве нет?

    то бишь на 64х-битной платформе int = int64
  • Я не знаю Си
    0
    есть подтверждение этого мнения?

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

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

    www.cplusplus.com/doc/tutorial/variables/
    For example, if we want to declare an int variable called a initialized with a value of 0 at the moment in which it is declared, we could write:
    int a = 0;

    вот они говорят, что это декларация, то бишь объявление. включающее инициализацию.

    о
  • Я не знаю Си
    0
    10ый сразу входным аргументом намекнул, что засада в переполнении. 11ый и 12ый сразу как то сами собой стали рассматриваться и с этой точки зрения.
    если бы 10ого не было, то я б в них не понял бы, в чем ошибка.

    тут кстати есть такой нюанс — типа да, каким то приемом из языка не пользовался никогда или с каким то конкретным багом не сталкивался, приходишь на собеседование, задают вопрос, тыкву чешешь и даешь неправильный ответ. потом приходишь домой, компилируешь в различных позах и все становится очевидно в течение нескольких минут. а поздно, интервьюер уже сделал о тебе мнение, что ты язык не знаешь и вообще безнадежен…
  • Я не знаю Си
    0
    проверил. не ругается. не встречал такой буг.
  • Я не знаю Си
    0
    получается что отличается синтаксис объявления локальной переменной и глобальной.
    А должны они отличаться лишь в областью видимости. По определению.

    ЗЫ тут мне начинает казаться, что люди чьи то баги оправдывают, как будто так и должно быть.
  • Я не знаю Си
    0
    это нетривиальное решение называется strnlen.

    кому только в голову может придти использовать более чем двухгигабайтные строки…

    ЗЫ и кстати да, с переполнением это ошибки не от незнания С, то есть это не ошибка непостредственно кодера, это архитектурная ошибка, если результат вычисления может непоместиться в переменную.
  • Я не знаю Си
    0
    компилятором под vxWorks и солярис проверил, тоже не ругается на глобальные.
    однако стало непонятно почему глобальная переменная так объявляется без ошибки, а локальная с ошибкой? особенности кода компилятора?

    vs же ругается одинаково и на локальную и на глобальную.
  • Я не знаю Си
    +2
    то что это wtf и не оспаривается.

    я ответил «некорректный код» на первый вопрос.
    и почему то не считаю что ответил неправильно.

    тут же попробовал скомпилить это, visual studio выдал error C2086: redefinition.
    можно попробовать и на других компиляторах, но даже если это где то и заработает, меня не убедит в том, что это не гогнокод и что это корректно.
  • Я не знаю Си
    –1
    тоже возникло такое впечатление. редкостной маразматичности куски кода. индус-стайл.
    «хороший программист простым кодом пишет гениальные алгоритмы. а не наоборот.»(с) не помню чьё
  • И снова про сортировки: выбираем лучший алгоритм
    +2
    Почему же, quicksort параллелится очень просто. Каждая итерация делит массив на две части, знай только да создавай новые треды на них. Только самая долгая, самая первая итерация не параллелится.

    Тоже хотелось бы посмотреть результаты в параллельной обработке. И конечный результат и прирост от параллелизма. На 4х-ядернике желательно, или более.
  • Неблокирующие очереди: обмен сообщениями между потоками
    0
    Потерялась часть сообщения.… работает существенно быстрее.
  • Неблокирующие очереди: обмен сообщениями между потоками
    0
    С синхронизацией проблем никаких нет. Траффик вертится сколько угодно без каких либо потерь сообщений и ексепшенов.
    Но есть проблемы с производительностью. Простая конструкция на ConcurrentDictionary<string,ConcurrentQueue
  • Барьеры памяти и неблокирующая синхронизация в .NET
    +2
    Есть мелкая неточность
    ->Если инструкции программы выполнялись бы именно в том порядке, в котором они определены, то обе строки всегда оказывались бы равными “а”.
    Обе строчки практически никогда не будут равны «a». Корректно написать — хотя бы одна строчка всегда будет «а».

    Если в следущей строчке заменить && на ||, то на однопроцессорной машине всегда будет 100 выводить.
     if (_firstString == null && _secondString == null)
    


    Но тем не менее, пример показателен, в 0.0007% случаев обе операции чтения происходят раньше операций записи.
  • Неблокирующие очереди: обмен сообщениями между потоками
    0
    ->публикация ссылки вполне может произойти раньше чем обновление данных, несмотря на порядок выражений в коде
    Теория говорит, что операции записи, в т.ч. если один из них внутри вызова функции, не могут меняться местами. habrahabr.ru/blogs/net/130318/
  • Неблокирующие очереди: обмен сообщениями между потоками
    –2
    ->Только вот Peek и Take разные операции.
    Да неужели. А что будет если во время Peek, после проверки isEmpty, операция TryDequeue из другого потока считает последний элемент?
    Опять жу будет резолвиться указатель head, и в это время другой поток его подменяет.
    Ryadovoy вот возмущается именно по этому поводу.
    ->В общем же случае «один пишет, многие читают» совсем не означает потокобезопасность.
    В общем нет, а в случае атомарных операций(подмена одного указателя), где данные валидны и до и после апдейта — все безопасно. Об этом кстати можно прочитать если пройти по ссылке, которую я дал.
  • Неблокирующие очереди: обмен сообщениями между потоками
    –3
    Хочется обратить внимание на метод TryPeek
    Интерлока при чтении нет, только при записи.
    Мораль: один пишет, многие читают = потокобезопасность.
        public bool TryPeek (out T value)
        {
          if (IsEmpty) {
            value = default (T);
            return false;
          }
          
          Node first = head.Next;
          value = first.Value;
          return true;
        }
    
  • Неблокирующие очереди: обмен сообщениями между потоками
    –1
    ->на C++ объект может удалится вторым потоком в любой момент времени
    А не надо его сразу удалять. Перекладываешь его в другое место и удаляешь позже, по таймауту.
    GC эту задачу решает за разработчика и удаляет объект когда он гарантировано не используется. Если один тред успел схватить поинтер на одну процессорную операцию раньше, чем второй его подменил, GC его не удалит.

    А вообще в моем понимании никаких новых тредов при работе быть не должно. Они все должны стартовать при начале и завершаться в конце.
  • Неблокирующие очереди: обмен сообщениями между потоками
    –2
    Ежели боязно делать непосредственно, можно сделать сначала tmp=byTID; а потом tmp.TryGetValue();
  • Неблокирующие очереди: обмен сообщениями между потоками
    –1
    К C# не относится, поинтер есть поинтер. Чтобы получить адрес метода TryGetValue резолвится поинтер byTID, там в момент апдейта фактически два объекта, и поток может выполнить эту операцию как со старым объектом, так и с новым. Операция замены поинтера атомарна по определению, поэтому вникуда попасть нельзя, в любом случае там валидный объект.
  • Неблокирующие очереди: обмен сообщениями между потоками
    –2
    Не вижу причин почему нельзя malloc делать в одном треде, а free в другом. А вот с тем, что он может быть блокирующим возможно и связано то, что уменьшив количество блоков в 8 раз я получил двукратный рост скорости. 32х уже дает единицы процентов. Полностью lock-free конечно уже нельзя назвать, однако на блокирующей очереди блокировка идет на каждый вызов и количество блокировок никак не уменьшить, а количество маллоков урезается на раз.
  • Неблокирующие очереди: обмен сообщениями между потоками
    0
    Если не ошибаюсь, он как раз использует кольцевой буфер. Следовательно возможны потери сообщений.
  • Неблокирующие очереди: обмен сообщениями между потоками
    –1
    Поэтому надо делать разрегистрацию.
     register(...);
     while(!terminated)
     {
       //process messages
     }
     unregister();
    
  • Неблокирующие очереди: обмен сообщениями между потоками
    –2
    Мютекс используется не для добавления элементов в словарь, а для его подмены. Тут неважно получил ли поток этот поинтер до апдейта или после, он в обоих случаях валидный.
    Но в случае разрегистрации сообщение может добавиться в очередь той ноды которая только что разрегистрировалась.
    В случае шарпа указатель на ноду «потеряется» и вместе с содержанием очереди уйдет к GC. А вот в случае с неплюсовым си, пришлось делать т.н. отложенную очистку. Там, в частности из-за подобных вещей, код выглядит более громоздко, на шарпе все минимализировалось. Очень понравился язык.
  • Неблокирующие очереди: обмен сообщениями между потоками
    –1
    да, код протестирован, на двуядерном, нагрузочный тест сделаю попозже.
  • Неблокирующие очереди: обмен сообщениями между потоками
    0
    тэг code почему то все снес влево вне зависимости от отступов,
    каким тэгом делают, чтоб код прилично выглядел?