Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2019 February 15

IT

Iegor Timukhin in NodeUA - JavaScript and Node.js in Ukraine
Насчет Мьютекса на Atomics: https://github.com/HowProgrammingWorks/Mutex/blob/master/JavaScript/5-no-race.js Мне кажется не корректная реализация. Т.к. в мьютексе Atomics.wait() блакирутся не весь массив
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Iegor Timukhin
Насчет Мьютекса на Atomics: https://github.com/HowProgrammingWorks/Mutex/blob/master/JavaScript/5-no-race.js Мне кажется не корректная реализация. Т.к. в мьютексе Atomics.wait() блакирутся не весь массив
Atomics.wait() не массив блокирует, а ждет пока изменится одна ячейка и придет уведомление. Если ни кто не пришлет notify, а ячейка изменится, то он будет ждать дальше.
источник

IT

Iegor Timukhin in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Atomics.wait() не массив блокирует, а ждет пока изменится одна ячейка и придет уведомление. Если ни кто не пришлет notify, а ячейка изменится, то он будет ждать дальше.
так ячейка которая блокируется не так которая изменяется
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
ячейка не блокируется, в это время можно все ячейки писать. Там две вещи происходят, в одной 32битной ячейке живет лок от мьютекса, а в двух других живут x и y. Мы через мьютекс делаем критическую секцию, в которой меняем и x и y последовательно. И благодаря мьютексу, ни кто не может менять y пока мы меняем x и наоборот. Для блокировок только одна ячейка используется, блокируется не ячейка, а блок кода между enter и leave
источник

IT

Iegor Timukhin in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
ячейка не блокируется, в это время можно все ячейки писать. Там две вещи происходят, в одной 32битной ячейке живет лок от мьютекса, а в двух других живут x и y. Мы через мьютекс делаем критическую секцию, в которой меняем и x и y последовательно. И благодаря мьютексу, ни кто не может менять y пока мы меняем x и наоборот. Для блокировок только одна ячейка используется, блокируется не ячейка, а блок кода между enter и leave
Почему не может менятся? У нас на запись все равно гонка. Если у нас два независимых мьютекса в двух разных тредах, то они не знаю о существовании друг друга, а могут ориентироваться только на значение в общем массиве.
источник

IT

Iegor Timukhin in NodeUA - JavaScript and Node.js in Ukraine
Кстати, если убрать Мьютекс и сделать Atomics.add() в Point для изменения пложение все работат.
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Iegor Timukhin
Почему не может менятся? У нас на запись все равно гонка. Если у нас два независимых мьютекса в двух разных тредах, то они не знаю о существовании друг друга, а могут ориентироваться только на значение в общем массиве.
Да, они ориентируются только на значение в общем массиве, но они могут ожидать друг-друга и слать уведомления через atomics. Без мьютексов не может работать точно, x и y смогут независимо меняться и точно поменяются за 2млн изменений то
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Iegor Timukhin
Почему не может менятся? У нас на запись все равно гонка. Если у нас два независимых мьютекса в двух разных тредах, то они не знаю о существовании друг друга, а могут ориентироваться только на значение в общем массиве.
Без мьютексов окончательное значение (0, 0) но промежуточное неправильное, видать атомиксы сделаны через очередь, и накатываются в любом случае, но с отставанием.
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Например:
{ mutex: Mutex { lock: Int32Array [ 1 ], owner: false },
 point: Point { data: Int32Array [ 0, 0 ] } }
{ point: Point { data: Int32Array [ 131128, 128327 ] } }
{ point: Point { data: Int32Array [ 0, 0 ] } }
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Вот как промежуточное x не равно y ?
источник

N

Nick in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Вот как промежуточное x не равно y ?
Они же не одновременно меняются, поэтому может быть и не равно
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
А с мьютексами должно быть всегда равно
источник

N

Nick in NodeUA - JavaScript and Node.js in Ukraine
Ну да, потому что оба значения в одной критической секции меняются
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
из-за критической секции x, y должны меняться только вместе
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
точнее, они все равно меняются последовательно, но ни кто об этом не узнает
источник

IT

Iegor Timukhin in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Да, они ориентируются только на значение в общем массиве, но они могут ожидать друг-друга и слать уведомления через atomics. Без мьютексов не может работать точно, x и y смогут независимо меняться и точно поменяются за 2млн изменений то
Всеже не понятно как происходит блокировка в данной реализации. бедь перед mutex.enter() не происходит проверки залочен ли мьютекс
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
enter проверяет же Atomics.wait(this.lock, 0, LOCKED);
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Эта строка сразу проходит, если this.lock[0] !== LOCKED
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
иначе Atimics.wait ждет
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Судя по тому что я вижу оно как-то странно ждет
источник