172 похожих чатов

Ребят, подскажите. Есть мьютекс, который используется, как в асинхронной среде,

так и синхронной среде. Проблема в том, что если я использую мьютекс из std, то у меня потенциально лочится экзекьютор в асинке. Если из tokio::sync, то мне приходится плодить отдельный рантайм для block_on() над асинхронным мьютексом. Есть ли вообще реализации sync <=> async мьютекса ?

26 ответов

12 просмотров

Асинхронный мьютекс почти никогда не нужен

Max Силинг
Асинхронный мьютекс почти никогда не нужен

А если у тебя синхронный мьютекс держится между вызовами .await, которые потенциально долгие?

Max Силинг
Задуматься о дизайне.

Ответ уровня - Доктор у меня болит когда я делаю так - Не делайте так больше

Артем Пятницкий
Ответ уровня - Доктор у меня болит когда я делаю т...

Ну, да, примерно. Если у тебя в коде появились асинхронные мьютексы, то, скорее всего, тебе дальше будет больно. В этот момент имеет смысл остановиться и подумать, нельзя ли это выразить по-другому.

Max Силинг
Ну, да, примерно. Если у тебя в коде появились аси...

А есть вообще причина не использовать асинхронные мьютексы вообще везде? Ну то есть я реально хочу узнать почему бы их не использовать вместо синхронных (Пы. сы. я юзаю синхронные примитивы в асинхронном коде по рекомендации токио, но просто хочу узнать причину не юзать асинхронные)

Артем Пятницкий
А есть вообще причина не использовать асинхронные ...

Ровно та причина, по которой они вообще существуют — их можно держать между await-поинтами. Синхронизация резко становится сложнее, если пока ты держишь мьютекс, может произойти что угодно ещё в том же треде. Ну и они несколько менее производительные, но это не так важно само по себе.

Lighty- Автор вопроса
Артем Пятницкий
А есть вообще причина не использовать асинхронные ...

Ай гесс, дис ризон - "The feature that the async mutex offers over the blocking mutex is the ability to keep it locked across an .await point. This makes the async mutex more expensive than the blocking mutex, so the blocking mutex should be preferred in the cases where it can be used."

Артем Пятницкий
А если у тебя синхронный мьютекс держится между вы...

Всегда, ещё задолго до async/await, когда человечество знало только потоки — всегда всех предупреждали против долгого лока мьютекса. Потому что пока мьютекс залочен, работает только один поток, и многопоточная программа превращается в однопоточную. Только медленнее, потому что ещё накладные расходы на мьютекс. Это никогда не имело смысла, и прозрачно намекало на неудачный дизайн.

Lighty
Ай гесс, дис ризон - "The feature that the async m...

Ну то есть если мне нужно держать лок в течении нескольких .await’ов, то лучше юзать асинхронный?

Артем Пятницкий
Ну то есть если мне нужно держать лок в течении не...

Да, но ещё лучше — сделать так, чтобы его не надо было держать в течение нескольких await-ов.

Max Силинг
Да, но ещё лучше — сделать так, чтобы его не надо ...

Не знаю как можно пройтись по коллекции и вызвать у каждого элемента асинхронную функцию так, чтобы лок на колекцию не держать

Alexander Chichigin
Всегда, ещё задолго до async/await, когда человече...

*Один поток, из всех, которые работают с этими же данными Или я чего-то про мьютексы не знаю и они все потоки останавливают?

Max Силинг
Зачем держать лок на коллекцию?

Ну мне нужно пройтись по Arc<Mutex<Vec<_>>> допустим. В нее могут добавлять элементы и убирать. Как обойтись без мьютексов и лока на них если нужна операция, выполняющаяся на всех иногда?

Артем Пятницкий
*Один поток, из всех, которые работают с этими же ...

Да, из всех, которые работают с этими данными. Но если Вам нужно, чтобы с этими данными работал только один поток — зачем запускать несколько и лочить их мьютексом?

Alexander Chichigin
Да, из всех, которые работают с этими данными. Но ...

Не особо понял. У меня есть состояние приложение AppState через которое все компоненты общаются. Каждый компонент в своей таске запущен и может модифицировать AppState. Как без примитивов синхронизации тут обойтись?

Артем Пятницкий
Не особо понял. У меня есть состояние приложение A...

Зависит от конкретной нагрузки Можно, например, запустить главный стейт в отдельной таске и посылать ему сообщения по каналам

Max Силинг
Точно ли это обязано быть Vec?

В моем случае это hashmap в основном, но. я просто пример коллекции привел

Max Силинг
Зависит от конкретной нагрузки Можно, например, за...

жирнющие match event мне тоже не очень нравятся (а в моем случае их реально много)

попробуй использовать канал вместо мьютекса некоторые виды каналов позволяют взаимодействовать между двух сред даже канал из std синхронный может подойти (unbounded), зависит что и откуда ты посылаешь и где принимаешь по-сути токийский мутекс это тоже очередь у тебя взаимодействие между потоками, поэтому не надо им иметь общую блокировку, пусть общаются сообщениями по -поводу синк-мутекса: если он нужен чтобы защитить данные, т.е. взять мутекс, записать в переменную и тут же отпустить, то подойдет и синхронный, потому что запись в память быстро происходит

Yaro
попробуй использовать канал вместо мьютекса некото...

Там основная задержка - не запись в память, а лок мутекса. Несколько (десятков) миллионов локов в секунду могут загрузить процессор на 100%. Так что с ними надо осторожно

Lighty- Автор вопроса
Yaro
попробуй использовать канал вместо мьютекса некото...

На самом деле, решил проблему чисто архитектурно. У меня лок происходит в цикле (внутри асинка). Как только я получаю данные из структуры, я под них спавню таску. Поэтому, анлок получается практически инстантным. А так- спасибо, не подумал о каналах, буду иметь в виду.

Похожие вопросы

Обсуждают сегодня

Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
было так ;void set_http_ver(RESPD* ptr, char* version, uint32_t length) // example: 'RTSP/1.1 ' set_http_ver: mov eax, [esp + 4] mov ecx, [esp + 8] ...
Mixail Frolov
5
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Карта сайта