
Daniel
15.11.2017
22:15:58
накидайте, конечно

xPushkin
15.11.2017
22:32:13
https://play.golang.org/p/UveUE7K0OW
К сожалению в Playground запустить не получается, но на своей машине запустить можно
Через пару секунд ловим дедлок и больше ничего не выводится

Google

nezorflame
15.11.2017
22:43:06
и увидишь немного магии
да такой, что процесс убивать потом придется
:)
иными словами: проблема была не в мьютексе
я про код на машине
playground как не работал, так и не будет с таким примером

xPushkin
15.11.2017
22:48:07
А вот попробуйте такой пожалуйста - https://play.golang.org/p/DtK8ptkWfQ

nezorflame
15.11.2017
22:52:15
вот тут - да

xPushkin
15.11.2017
22:52:37
То есть неудачная попытка Lock блокирует любой последующий RLock?
Но зачем..?

Google

nezorflame
15.11.2017
22:56:04
ща

xPushkin
15.11.2017
23:01:12
Этому есть решение?)
Или проще перейти на обычный Mutex?
Я просто не очень понимаю логику. Почему Lock не может подождать своей очереди ?

nezorflame
15.11.2017
23:03:59
в общем
я знаю как это пофиксить

xPushkin
15.11.2017
23:04:17
Подскажите?

nezorflame
15.11.2017
23:05:20
21 и 22 местами поменять

xPushkin
15.11.2017
23:06:47
Сейчас попробую это на основе.
Хорошо
Вроде вижу способ пофиксить
Спасибо большое
Всё равно не понимаю логику

nezorflame
15.11.2017
23:14:39
за логикой надо шаманов местных призвать, я чет под ночь уже сам не варю

xPushkin
15.11.2017
23:14:57
Ну согласитесь довольно нелогично

nezorflame
15.11.2017
23:15:24
а вообще конечно спавн вечного for внутри еще одного вечного for это сильно

xPushkin
15.11.2017
23:16:07

Google

nezorflame
15.11.2017
23:20:14
ну в общем, по идее, получилось так:
- заспавнился RLock в первой функции
- запустилась вторая функция
- несколько раз прокрутился цикл RLock - RUnlock во второй (а в первой RLock все еще висит и будет висеть, пока рантайм не решит, что можно вернуть управление в первую)
- пошел Lock из третьей
- все, приехали
по сути в этом примере рантайм никогда не возвращается в processOne
из-за чего первый RLock как висел, так и висит
поэтому Lock вечно будет ждать

xPushkin
15.11.2017
23:21:44

nezorflame
15.11.2017
23:22:06
эээ, неет
сперва мы в main
main запустит на управление все, что в нем есть

xPushkin
15.11.2017
23:22:26
Да

nezorflame
15.11.2017
23:22:52
go a.processThree() ничто не мешает запуститься

xPushkin
15.11.2017
23:23:18
Потому что уже будут RLock'и

xPushkin
15.11.2017
23:24:13
А когда он доходит до Lock он не ждёт, а устраивает нам дедлок.

nezorflame
15.11.2017
23:25:29
он ждет
просто видит, что это продлится вечность
и падает

xPushkin
15.11.2017
23:25:46
:(
Он не падает..

nezorflame
15.11.2017
23:26:39
это можно легко проследить кстати
поставить слип

Google

nezorflame
15.11.2017
23:26:58
func main() {
go a.processOne()
go a.processThree()
time.Sleep(5 * time.Second)
<-make(chan struct{})
}

xPushkin
15.11.2017
23:27:07
и падает
Он блокируется и не даёт RLock в processTwo

nezorflame
15.11.2017
23:27:53
по логу будет видно, что ожидание лока висит

Admin
ERROR: S client not available

xPushkin
15.11.2017
23:31:25

nezorflame
15.11.2017
23:32:54
10.644µs Trying to lock Three
40.283µs Trying to lock One
61.79µs Three Locked
76.079µs Three Unlocked
86.768µs Trying to lock Three
93.042µs Three Locked
106.329µs Three Unlocked
113.007µs Trying to lock Three
118.985µs Three Locked
123.928µs Three Unlocked
137.591µs Trying to lock Three
142.745µs Three Locked
148.29µs Three Unlocked
178.653µs One Locked
185.472µs a
194.526µs Trying to lock Two
207.181µs Two Locked
211.732µs a
216.249µs Two Unlocked
220.317µs Trying to lock Two
224.937µs Two Locked
229.667µs a
234.137µs Two Unlocked
238.716µs Trying to lock Two
243.754µs Two Locked
248.37µs a
252.892µs Two Unlocked
256.991µs Trying to lock Two
277.107µs Trying to lock Three
fatal error: all goroutines are asleep - deadlock!

xPushkin
15.11.2017
23:36:29
До сих пор не понимаю зачем Lock блокирует следующие RLock'и. Мог быть дать им Runlockнуться и уже Lock'аться.
"Ни себе ни людям"


nezorflame
15.11.2017
23:38:10
на самом деле тут порядок всегда неоднозначный выходит
может быть вот так еще
2.236µs Trying to lock Three
20.181µs Trying to lock One
31.619µs Three Locked
35.897µs Three Unlocked
38.297µs Trying to lock Three
40.604µs Three Locked
42.839µs Three Unlocked
44.932µs Trying to lock Three
59.091µs One Locked
64.375µs a
71.716µs Trying to lock Two
75.306µs Two Locked
78.67µs a
82.281µs Two Unlocked
85.456µs Trying to lock Two
88.805µs Two Locked
93.029µs a
96.779µs Two Unlocked
100.008µs Trying to lock Two
102.976µs Two Locked
105.856µs a
109.073µs Two Unlocked
112.223µs Trying to lock Two
115.308µs Two Locked
118.377µs a
121.508µs Two Unlocked
124.481µs Trying to lock Two
127.609µs Two Locked
130.68µs a
133.882µs Two Unlocked
136.761µs Trying to lock Two
140.261µs Two Locked
143.257µs a
146.398µs Two Unlocked
149.513µs Trying to lock Two
fatal error: all goroutines are asleep - deadlock!
зы - это time.Since в начале
ладно, спать пора, авось завтра кто еще включится в тему


xPushkin
15.11.2017
23:41:02
Уж пожалуйста
Ладно
Спасибо вам большое
Весь день пытался понять что именно происходит

nezorflame
15.11.2017
23:41:23
да, если бы еще объяснить нормально смог)

Dmitri
16.11.2017
06:11:09
а вот так не?
if !math.IsNaN(result) {
return result
}
return 0

Александр
16.11.2017
06:12:05

Google

nezorflame
16.11.2017
06:47:52
if math.IsNaN(result) {
return 0
}
return result

Dmitri
16.11.2017
06:48:43
боюсь, придется с вами согласиться. Аккуратнее выглядит.

some_random_anonymous
16.11.2017
06:48:47
Да ну, какая-то экономия на спичках

Dmitri
16.11.2017
06:48:49
логичнее даже(

nezorflame
16.11.2017
06:49:04

Dmitri
16.11.2017
06:49:10

nezorflame
16.11.2017
06:49:10
А в качестве кода

Dmitri
16.11.2017
06:49:19
тут не экономия, тут структурный подход

some_random_anonymous
16.11.2017
06:49:26
Ну что тут может быть неочевидного?

Dmitri
16.11.2017
06:49:32
дефолтное поведение - один return в конце
отклонения - поштучно до него с нулевыми return'ами

some_random_anonymous
16.11.2017
06:49:50