
Oleg
04.11.2017
16:49:03

Ievgenii
04.11.2017
17:52:01
Файберы - это простые "функции", которые выполняются по очереди в одном потоке
Они последовательны

Google

Pavel
04.11.2017
17:53:56
Я про случай когда у нас во многих тредах крутятся event loop
Вот как vibe core и делает по сути
И libasync так делает, в теории

Ievgenii
04.11.2017
17:54:45
Им блокировки не нужны, т.к. паралельного доступа нет
Да
И что?
Блокировки нужны только в случае паралельного доступа к данным

Pavel
04.11.2017
17:55:57
Файбер 11 из треда 1 и файбер 21 из треда 2 могут конкурировать за доступ к расшаренному ресурсу

Ievgenii
04.11.2017
17:56:23
Тут не важно из чего осуществляется длступ
Он из разных потоков - это ключевой фактор
А файбер тут не при чем

Pavel
04.11.2017
17:57:43
вообще да ты прав можно походу просто synchronized секцию использовать и она автоматом подойдет для фиберов
Ну только тогда фибер заблокируется и будет ждать входа в секцию, а мог бы отдать управление другому фиберу пока.

Google

qwerty
04.11.2017
18:00:50
@chebotarevp fiber работает только с io параллельно. Все остальное последовательно. То есть 2 fibers не будут одновременно работать с памятью через какой-то объект
следовательно гонки данных нет

Pavel
04.11.2017
18:01:29
Ты говоришь про один тред

qwerty
04.11.2017
18:01:34
аа

Pavel
04.11.2017
18:01:43
А если они в разных то есть

qwerty
04.11.2017
18:01:58
а ты имеешь ввиду несколько threads и там несколько fibers
я понял
да, в этом случае надо. Но fibers тут не при чем

Pavel
04.11.2017
18:02:19
Например у тебя vibe.d работает в 8 тредах, в каждом треде по 200 фиберов

qwerty
04.11.2017
18:02:27
я понял идею

Ievgenii
04.11.2017
18:10:27
Он блокируется только на момент записи
Расчет осуществляется до блокировки мьютекса
А блокируется он только на момент присвоение, а это очень быстрая операция.
Ну если у тебя там не пипец какая логика
Но тут других вариантов нет
Либо какое-то IPC с передачей данных по каналу связи, или мьютексы... Выбирай.
Ну или писать без мьютексов и ждать ошибки памяти

Pavel
04.11.2017
18:41:18
И если там мьютекс захватили 7 файберов то 8й будет стоять в очереди и ждать

Google

Ievgenii
04.11.2017
18:42:10
t.h=7;
t.h=8;
Приведет к 2м блокировкам
Захватить может только 1 поток

Pavel
04.11.2017
18:42:58
ну да

Ievgenii
04.11.2017
18:43:14
Что значит 7 файберов захватило???

Pavel
04.11.2017
18:43:19
Не захватить, а встать в очередь я имел в виду

Ievgenii
04.11.2017
18:43:49
Ievgenii Kyrychenko:
t.h=7;
t.h=8;
Тут будет 2 блокировки
И только на момент записи

Pavel
04.11.2017
18:44:11
что за t?

Ievgenii
04.11.2017
18:44:34
Ну какой-то синхронизирующийся объект

Ievgenii
04.11.2017
18:44:45
t.h=test();
По логике сперва будет расчет test(), а после блокировка мьютекса
И присвоение
Чтобы минимизировать время блокировки

Pavel
04.11.2017
18:45:47
так это присвоение. Но ведь бывают длинные критические секции
Такие как метод pop из очереди например

Ievgenii
04.11.2017
18:46:23
Ievgenii Kyrychenko:
Ну если у тебя там не пипец какая логика
Вот на поп он и будет блокироваться

Google

Ievgenii
04.11.2017
18:47:00
Это быстро

Pavel
04.11.2017
18:47:08
Ну тривиальные случаи не интересно рассматривать

Ievgenii
04.11.2017
18:47:20
Приведи тогда пример
Чтобы я тебя правильно понял

Pavel
04.11.2017
18:48:55
Это надо собирать компилирующийся пример с vibe core

Ievgenii
04.11.2017
18:50:26
Так напиши
Хоть примерно, чтобы я понимал, что ты имеешь ввиду

Pavel
04.11.2017
21:07:53
Щас запостю, почти доделал пример )
5 мин..
https://run.dlang.io/is/xMIJaY

Admin
ERROR: S client not available


Pavel
04.11.2017
21:27:24
Вот. 3 треда. В каждом треде сначала запускается долгий файбер который долго пишет в shared базу.
Потом во втором и третьем треде запускаются несколько быстрыйх файберов.
В данной конфигурации без мьютекса видно что быстрые файберы отрабатывают уже где-то в самом конце после того как все написали в базу.
Но если раскомментировать пятую строчку и включить мьютекс - то при запуске быстрые файберы моментально выполнятся, а долгие файберы будут как положено долго работать и стоять в очереди на вход в критическую секцию.
То есть если делать по обычной через synchronized секции и без оптимизационного файберного мьютекса, то первый же файбер который входит в критическую долгую секцию заторомозит ВСЕ файберы во ВСЕХ тредах, в которых хотя бы 1 файбер также ждет входа в эту секцию.
Довольно популярный кейс - например у тебя vibe.d работает, много файберов раздают статические файлы (картинки и js скрипты) и несколько файберов разбросаны по тредам и пишут что-то в базу/память в эксклюзивном режиме. Тогда в моменты записи в базу у тебя будет останавливаться отдача статики, тогда вообще смысла в асинхронности нет.


Ievgenii
04.11.2017
21:44:34
Что за глупасть?
Зачем тебе и синхронизация и мютекс?
Так конечно!
Ты же явно блокируешь мютекс, а потом ещё раз блокируешь мютекс в синхронизационном объекте

Google

Ievgenii
04.11.2017
21:45:50
Конечно так будет все заблокированно

Pavel
04.11.2017
21:46:33
Ну вот то есть yield с мьютексом для файберов полюбому нужен.

Ievgenii
04.11.2017
21:46:35
Ты должен рассчитать данные, а блокировать только в записи. И это не ты будешь блокировать, а сама реализация синхронизации
Нет

Pavel
04.11.2017
21:47:50
> Ты должен рассчитать данные,
Ну вот тело метода write() это и есть рассчет данных.
Там могут бысть разные алгоритмы, невозможно все свести только к одной операции записи.

Ievgenii
04.11.2017
21:49:03
Расчет не должен быть в мьютексе
Он должен быть до его захвата

Pavel
04.11.2017
21:49:23
А где? Если он должен быть атомарным?

Ievgenii
04.11.2017
21:49:43
Расчет?

Pavel
04.11.2017
21:49:45
Да

Ievgenii
04.11.2017
21:50:06
Зачем?

Pavel
04.11.2017
21:50:15
Ну задача такая
Что за вопросы? =)

Ievgenii
04.11.2017
21:50:38
Вычитка данных для его расчетов может быть атомарной, а вот расчет не должен быть таковым

SR_team
04.11.2017
21:51:04
есть что-то типа mingw для D? чтобы собирать программы для винды на линуксе

Ievgenii
04.11.2017
21:51:24

Oleg
04.11.2017
21:53:43

SR_team
04.11.2017
21:54:48
знаю, и dub можно для более сложных, просто понадеялся, что есть нативное решение

Oleg
04.11.2017
21:55:14
Сложные случаи это когда надо 64 бита и либы
Например gtkd

SR_team
04.11.2017
21:55:51
Это не сложные