1. Куча / Говнокод #11731

    +117

    1. 1
    main = print x where x = x + 0

    http://ideone.com/9caQE

    result: Runtime error     time: 0.01s    memory: 3536 kB     signal: -1 
    input: no
    output: no
    stderr:
    prog: <<loop>>

    Запостил: LispGovno, 09 Сентября 2012

    Комментарии (8) RSS

    • int main(void) {
              return main() + 0;
      }

      😐
      Ответить
    • Я нашел то время, когда Bormand спит. Это стоило того. 5 утра, полёт нормальный.
      Ответить
    • Ну и что тут такого? Сработала защита от дурака.

      Механизм тут такой:
      Когда рантайм начинает раскрывать thunk, он превращает его в черную дыру (black hole). Если соседний тред попытается получить значение этого thunk'а - он заблокируется до тех пор, пока результат не будет готов. Если же тред нарвется на свою черную дыру - возникнет рассматриваемая ситуация с <<loop>> и прерыванием треда.

      Загуглить пояснения от авторов с ходу не смог, но нашлась вот такая ссылка:
      http://stackoverflow.com/questions/5126759/curious-about-how-loop-loop-is-evaluated-in-haskell
      Ответить
      • То есть это даже не стековерфлов, а прерванный дедлок? Круто.
        Ответить
        • Оговорюсь: Это конечно круто, но если локать каждый чанк (каждую константу и каждый элемент списка), то как жить с таким то? Это же медленно очень.
          Ответить
          • http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/multiproc.pdf

            Thus motivated, our main technical contribution is a novel tech-
            nique for reducing this overhead, by completely eliminating
            locking instructions and memory barriers from thunk evalua-
            tion and update (Section 3). We get the average overhead down
            to less than 6%.


            Насколько я понял статью - thunk превращается в черную дыру (если быть более точным в серую дыру, различия см. в статье) без блокировок и атомарных операций. Если два треда одновремено начали вычислять один thunk - так тому и быть, выражение вычислится 2 раза. В конце-концов хаскель чистый язык, и его рантайм может себе такое позволить, да и для коротких thunk'ов это намного дешевле, чем блокировки/CAS/что-то еще.

            Когда же thunk сложный, специальная процедура входящая в состав GC сканирует стек, выбирая все активные thunk'и, и пытается превратить их в настоящий blackhole (здесь уже используется полноценный compare-and-swap). Если это не удается (т.к. другой тред уже превратил thunk в черную дыру) - происходит отмена вычислений, отмотка стека, и тред уходит в сон до тех пор, пока thunk не будет вычислен.
            Ответить
            • Какая крутота! Только мне интересно, как он сложные чанки от простых отличает? Думаю частенько сбоит. И что значат в вашем понимании активные чанки?
              ЗЫ:Пошел читать пдфку, спасибо.
              Ответить
              • Активные - те, раскрытие которых начато текущим тредом, но еще не закончено.

                Сложные от простых - да никак, это я так глупо выразился... Просто на простых чанках GC скорее всего не наступит, и в полноценный блекхол они не превратятся.
                Ответить

    Добавить комментарий