- 1
main = print x where x = x + 0
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+117
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>>
FAKYOUINTIRNEAT 09.09.2012 02:44 # 0
ðŸ˜
LispGovno 09.09.2012 04:03 # +3
bormand 09.09.2012 06:32 # +2
Механизм тут такой:
Когда рантайм начинает раскрывать thunk, он превращает его в черную дыру (black hole). Если соседний тред попытается получить значение этого thunk'а - он заблокируется до тех пор, пока результат не будет готов. Если же тред нарвется на свою черную дыру - возникнет рассматриваемая ситуация с <<loop>> и прерыванием треда.
Загуглить пояснения от авторов с ходу не смог, но нашлась вот такая ссылка:
http://stackoverflow.com/questions/5126759/curious-about-how-loop-loop-is-evaluated-in-haskell
LispGovno 09.09.2012 09:27 # 0
LispGovno 09.09.2012 09:40 # +2
bormand 09.09.2012 12:16 # +2
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 не будет вычислен.
LispGovno 09.09.2012 12:41 # +1
ЗЫ:Пошел читать пдфку, спасибо.
bormand 09.09.2012 13:33 # +1
Сложные от простых - да никак, это я так глупо выразился... Просто на простых чанках GC скорее всего не наступит, и в полноценный блекхол они не превратятся.