|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||
Асинхронность и Семафор03.04.2021, 20:27. Показов 5681. Ответов 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++] семафор Семафор Семафор
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|