@dlangru

Страница 309 из 719
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? чтобы собирать программы для винды на линуксе

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
Это не сложные

Страница 309 из 719