
Ievgenii
06.11.2017
09:10:25
Что приводит к созданию 2х мьютеусов
Зачем?

Pavel
06.11.2017
09:11:00
Я выше уже объяснил зачем
Чтобы быстрые файберы не блокировались и отрабатывали быстрее

Google

Pavel
06.11.2017
09:12:22
Если уж и убирать - так наоборот внутренний synchronized мьютекс

Ievgenii
06.11.2017
09:12:42
https://run.dlang.io/is/okfCP8

Stepanos
06.11.2017
09:12:44
ето б в статью оформить))

Ievgenii
06.11.2017
09:13:21
А не то, как ты это сделал

Pavel
06.11.2017
09:13:58
Лол наконец то ты признал то что я тебе 2 дня пытаюсь донести :)

Ievgenii
06.11.2017
09:14:06
Что?

Pavel
06.11.2017
09:15:55
Для файбера мютекс не нужен

Ievgenii
06.11.2017
09:15:56
Я тебе написал как нужно делать ещё черт знает когда
Ты читать умеешь?

Pavel
06.11.2017
09:16:54

Ievgenii
06.11.2017
09:17:03
Не нужен

Google

Ievgenii
06.11.2017
09:17:20
Он нужен для того, чтобы память не покаребить
Но не файберу

Pavel
06.11.2017
09:18:00
Он нужен для того чтобы другие файберы пропустить вперед себя и не блокировать

Ievgenii
06.11.2017
09:19:10
Вот с такой формулировкой я соглашусь
Но именно это я бы реализовал по другому
Что-то типа того
https://run.dlang.io/is/6B5Fkx
Хотя лучше сделать стратегию.
Будет красивей

Just
06.11.2017
10:29:11

qwerty
06.11.2017
10:31:37
через socketset надо проверять изменения в сокетах
все ок будет

Andrey
06.11.2017
10:32:16
проверка состояния сокетов либо блокируется, пока нет активностей, либо таймаут можно ставить, либо в неблокирующем режиме проверить и дальше делать что то

Ievgenii
06.11.2017
11:10:37
Сокеты делаются не блокирующими и проверяется через select
Внутри цикла делается маленький слип
Или юзается какой-то event loop
В нем это с коробки
Так ты получаешь возможность отправки некоего сигнала в тред
Передача данных между ними - отдельный разговор
Можно сделать общую память и писать в нее

Google

Ievgenii
06.11.2017
11:21:43
Или все данные тоже передавать через эти сокеты
Так можно уйти от блокировок
НО, тут вопрос, будет ли это быстрее обычного мьютекса

Just
06.11.2017
11:40:17

Ievgenii
06.11.2017
12:01:46
Конечно
Но это на низком уровне
Ниже некуда
Там оно атамарно происходит

Pavel
06.11.2017
12:14:00
If the result of the operation indicates that there was no contention on the lock, the call to pthread_mutex_lock returns without ever context switching into the kernel, so the operation of taking a mutex can be very fast.
Only if contention was detected does a system call (called futex) and context switch into the kernel occurs that puts the calling process to sleep until the mutex is released.
http://opensourceforu.com/2013/12/things-know-futexes/ вот тут больше мяса, реализация для linux
A hash table maps the futex ID (uaddr param, above) to per-thread/per-process futex_q structs. When futex_wait() is called by a thread, a new futex_q object is created for it and added to the appropriate hash table entry. When futex_wake() is called, the same is used to wake up the sleeping process.


Pavel
06.11.2017
12:21:28
Когда кто-то отпустил мьютекс, то ядро идет в хеш таблицу и смотрит кто там еще ждет, будит ожидающий тред и передает исполнение ему. Никаких циклов :)

Ievgenii
06.11.2017
12:33:59
Хм...
Круто
Считал, что оно работает по другому

Just
06.11.2017
14:30:38

Ievgenii
06.11.2017
16:00:15
Мьютексы не такие уж и медленные, как их многие считают
Но лучше писать код без их использования

Just
06.11.2017
16:00:50
а почему они вообще должны быть медленными?

Google

Oleg
06.11.2017
16:06:32

Just
06.11.2017
16:07:33

Maxim
06.11.2017
16:11:34
На x86 у ядра свое адресное пространство и оно в собственном кольце привилегий выполняется, переключение туда-сюда — это очень тактозатратная операция должна быть

Just
06.11.2017
16:15:47
а если есть один общий shared объект, то что бы не использовать мьютекси для роботы с ним, можно использовать message passing, pairSockets, но по сути все равно нужно будет выстраивать очередь желающих с ним поработать и вызывать их. т.е. будет то же блокирование, но по другому сделаное.
т.е. не всегда же есть решение лучшее, чем мьютекс?

Andrey
06.11.2017
16:17:54
самое главное что бы потоки не простаивали

Just
06.11.2017
16:19:23
я сейчас о крайнем случае - есть N потоков и каждый из них только и работает с общим объектом (случай бессмысленный, конечно). так вот можно ли лучше, чем мьютексы, тут что-то использовать?

Andrey
06.11.2017
16:20:53
я бы вынес работу с объектом в один поток, и туда отсылал бы команды (я так с БД у себя работаю).

Just
06.11.2017
16:21:43
да, это разумно, но я такой пример привел, как раз, что бы можно было сравнить чистую скорость переключения доступа потоков к одному объекту

Andrey
06.11.2017
16:22:42
ну а смысл тогда N потоков использовать? Тогда должны быть распаралеливаемые вычисления

Just
06.11.2017
16:23:24
так нету смысла, кроме того, что бы сравнить скорость переключения потоков

Admin
ERROR: S client not available

Oleg
06.11.2017
16:26:38
А вот работа с сокетами она разве не через ядро идёт?

Andrey
06.11.2017
16:27:37
Кто нибудь юзал Registered Input/Output (RIO) в винде?

Oleg
06.11.2017
16:27:48
select и epoll это ведь тоже системные вызовы

Ievgenii
06.11.2017
16:49:46

Oleg
06.11.2017
16:51:16

Ievgenii
06.11.2017
16:51:18
Если делать какое-то IPC, то ты попадаешь на сериализацию данных

Oleg
06.11.2017
16:51:57
https://ru.m.wikipedia.org/wiki/Сравнение_с_обменом
Сложная техника программирования многопоточного

Google

Oleg
06.11.2017
16:52:21
Но самая скоростная

Ievgenii
06.11.2017
16:54:13
Ну тут есть другие проблемы:
Если нужно работать не с одним полем, а несколькими
Скажем 3 поля инта
То тут будет жопа
Одно значение изменит один поток, а второе значение другой
Самое верное - это блокировка
В идеале нужно уходить от таких подходов
Если же не уйти от такого
То лично я бы юзал мьютексы
Но можно и передавать значения через другой способ, а с данными всегда будет работать один поток
Но это будет дольше, чем мьютекс
Хотя, возможно, и правильней. Если в будущем планируется не только несколько потоков, но и несколько серверов.

Just
06.11.2017
17:07:52

Pavel
07.11.2017
14:38:52
Поставил я себе tilix, довольно крутая штука
Только при запуске почему то ругается на невозможность прочитать какие-то конфиги.

Ackeard
07.11.2017
14:50:59
+1. ругается. но я не стал разбираться ибо awesomewm может также

Oleg
07.11.2017
16:00:19
Может вы на ubuntu, а разработчик инженер redhat?))
И для rpm-based всё конфиги в нужных местах?

Ievgenii
07.11.2017
16:19:32
А что это?
Tilix

Ackeard
07.11.2017
16:20:16
у меня ругался на ArchLinux