|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||
Асинхронность и Семафор03.04.2021, 20:27. Показов 5650. Ответов 34
Метки нет (Все метки)
здесь как-то затронули тему...
что-то из источников складывается ощущение - что у каждого потока должен быть свой семафор?... в отличие от condition variable... верно ли моё ощущение?.. и тогда код, предоставленный, может не совсем корректен? Добавлено через 41 минуту p.s. сделаю оговорку:
хоть бинарный семафор и мьютекс часто используют для одинаковой цели - для синхронизации, но механизм работы у них разный: мьютекс блокирует, семафор сигнализирует... поэтому 1й используется для доступа к разделяемым переменным, а второй в отношениях producer-consumer (writer-reader) между потоками... в данном случае - разделяемый доступ к std::cout... - может, правильнее делать 2 семафора (для writer и для reader) - как здесь... механизм вкратце здесь важно:
в c++11 semaphore не вошёл, как и в boost, потому что разработчики предпочли mutex и condition_variable. поскольку работа семафора нестабильна... (пишу, как помню, - источник не найду сейчас)... наверно, по стандартной причине для сигнализирующих инструментов - spurious_wakeups:
0
|
|||||||||||
| 03.04.2021, 20:27 | |
|
Ответы с готовыми решениями:
34
Семафор Семафор в ОС
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 03.04.2021, 20:41 | |||
|
Добавлено через 4 минуты
0
|
|||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||
| 03.04.2021, 20:44 [ТС] | |||
чтобы исправить недоработки из прошлой темы)... или всё-таки в случае, который я кодом приложила, надо 2 семафора (как линк из-под спойлера) - т.е. 1 семафор на mainThread (где cout) и один семафор на остальные (которые ожидают, пока можно написать в cout) ? - натолкнули размышления про writer-reader по линку под спойлером
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.04.2021, 21:08 | ||
|
Добавлено через 6 минут Семафоры вроде нужны для других задач - для ограничение количества обращений к ресурсу. Например, если у тебя в очереди накопилось, допустим, 100 элементов, то семафор заблокирует потоки, которые добавляют элементы, и очередь не переполнится (хотя, я у себя никогда не использовал семафоры, поэтому могу соврать)
1
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||
| 03.04.2021, 21:20 [ТС] | |||||||
|
в conition_variable для страховки от них используется буль
вроде есть sem_trywait - надо, наверно, как-то обрабатывать его EAGAIN возврат...
0
|
|||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.04.2021, 21:33 | ||
|
0
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
||
| 03.04.2021, 22:28 [ТС] | ||
|
вот и говорю же семафор - это не блокировка... он просто сигнализирует (источник stackoverflow и др.)...
- может по этой причине и заявления о нестабильности его работы и невхождение его в c++11 ... CV же ждёт на мьютексе... (вот с++11 выбрал cv и мьютекс) вообще, скореееее всего просто кто как называет и кто как переводит в сети, - блокировка-неблокировка -- ведь суть не в этом, а в механизме срабатывания... видела на stackoverflow не одно заявление о возможности поведения типа spurious wake-ups у семафоров... p.s. с trywait была не права
перевод сетевой, не мой... я на англ.яз. своим глазам больше верю, чем google'у... к слову "блокировка" и др.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 03.04.2021, 22:31 | ||
|
0
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|
| 03.04.2021, 22:39 [ТС] | |
|
кстати я не про с++20 - там семафоры вроде вернули... и бинарные и со счётчиком
Добавлено через 5 минут да помню, уже не ждёт на мьютексе... но будет ждать пока её не notify кто-нибудь... - поэтому это тоже спорно - ждёт/не-ждёт
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||||||
| 04.04.2021, 10:03 [ТС] | |||||||||||||||
|
ещё раз - суть
===================== Добавлено через 1 час 32 минуты В общем, главное Отличие мьютексов о семафоров: (всё цитаты) 1) ownership - мьютекс д. разблокировать CS в том же потоке, в котором он его заблокировал (Locking Mechanism), семафор может быть разблокирован др. потоком (Signaling Mechanism)... (On Windows, binary semaphores are more like event objects than mutexes.) 2) испоьзуя мьютекс, можно попасть в deadlock, 3) Mutex is costly operation due to protection protocols associated with it. Main aim of mutex is achieve atomic access or lock on resource. ХОТЯ встречается и такое: Mutex is lightweight and faster than semaphore. Futex is even faster. вопрос скорости сводится к тому, что
4) ведь всё-таки: Mutexes are designed to be held only for a short time; violating this can cause poor performance and unfair scheduling. For example, a running thread may be permitted to acquire a mutex, even though another thread is already blocked on it. Whereas in case of semaphore if same process tries to acquire it again it blocks as it can be acquired only once. 5) -- Mutex works in user space. -- The correct use of a semaphore is for signaling from one task to another. Semaphores can also be used to signal from an interrupt service routine (ISR) to a task. Signaling a semaphore is a non-blocking RTOS behavior and thus ISR safe. Because this technique eliminates the error-prone need to disable interrupts at the task level.This works in kernel space. Officially:
6) A thread can call a wait function repeatedly on a mutex without blocking. However, if you call a wait function twice on a binary semaphore without releasing the semaphore in between, the thread will block. (aka like recursive mutex - A mutex can be locked more than once only if its a recursive mutex) p.s. , also there shouldn’t be any “first unlock”, rather it should be always “first lock”. ИТОГО
understand the inherent dangers associated with using the semaphore
Добавлено через 8 минут
p.s. действительно, парковка и светофор - видимо, по разному работают...Добавлено через 25 минут а как я только на c++17... то C (sem_init) не особо хорошо подряжать (смешивая С и С++)... да и не линукс у меня (многопоточный) и не для posix пишу, где хочешь-нехочешь, а даже кода не было condition_variable, то приходилось использовать С-шные семафоры, чтобы задействовать все ресурсы ради скорости, но и норм. IPC не забыть сделать
0
|
|||||||||||||||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||
| 04.04.2021, 17:25 [ТС] | |||||
|
и его рекомендации:
std::packaged_task
-- и чтобы не застревать в блокирующем fut.get()... или зациклить отлов этих get() - чтобы не блокировать io p.s. и моё напоминание в той же ветке:
0
|
|||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 04.04.2021, 18:40 | |||
|
1
|
|||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|
| 04.04.2021, 20:21 [ТС] | |
|
и для просто фьючерсов?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 04.04.2021, 20:43 | ||
|
1
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||
| 04.04.2021, 21:22 [ТС] | |||
|
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 04.04.2021, 21:25 | ||
|
При создании собственно std::future необходимо создавать объект (внутренний) динамически. Это может сказаться при запуске задачи в пуле потоков.
1
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
||
| 04.04.2021, 21:32 [ТС] | ||
|
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 04.04.2021, 21:35 | |
|
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
||
| 05.04.2021, 08:53 [ТС] | ||
|
я понимаю, что std::async более высокоуровневый, чем std::thread... в связи с этим - вопрос на уточнение:
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||
| 05.04.2021, 10:03 | ||||
|
1
|
||||
| 05.04.2021, 10:03 | |
|
Помогаю со студенческими работами здесь
20
Семафор [C++] семафор Семафор Семафор
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Архитектура слоя интернета для сервера слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|