@dlangru

Страница 311 из 719
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
Да, для каждого треда создаётся своя пара сокетов и они общаются через них. Данные или передаются через них, или используется общая память.
но бесконечный цикл в котором проверяются данные сокета грузит ядро на 100% или надо sleep ставить?

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
Хм...

Круто

Считал, что оно работает по другому

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: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
https://ru.m.wikipedia.org/wiki/Сравнение_с_обменом
интересная штука и примеры хорошие, в Ди видимо такое можно делать используя https://dlang.org/phobos/core_atomic.html

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

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