|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||
Асинхронность и Семафор03.04.2021, 20:27. Показов 5636. Ответов 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
Семафор Семафор в ОС
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||
| 05.04.2021, 10:59 [ТС] | |||||||
сейчас нет msys2 32x, чтобы gcc/mingw c++20 32x потянуть оттуда... не знаю, как установить... сижу на c++17, установленного из msys2 год назад (gcc 9.3, даже не 10.0)Добавлено через 34 минуты
![]()
0
|
|||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|
| 05.04.2021, 14:03 | |
|
JeyCi, проблема из вашей цитаты (кстати, почему не приводите ссылку на первоисточник?) - это не проблема вектора, а проблема кривых рук автора, как бы грубо это не звучало. Если мы передаем нечто по ссылке, и при передаче по ссылке это нечто потенциально может изменить свое состояние (в частности, может быть перемещено), то при выполнении в конкурентной среде у нас всегда будет гонка за это состояние. Независимо от того, вектор у нас или очередь, или еще что.
Глобально же проблема автора именно в том (и на это ему указали в ответах), что у него слишком много состояний. Он написал неоправданно сложный код, в котором запутался и потерял контроль над происходящим.
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||
| 05.04.2021, 19:04 [ТС] | |||||||||
|
ссылка
https://codereview__stackexchange__com__/questions/247483/blocking-queue-in-c-using-semaphores
боюсь порежут
думаю, ваша правда в захвате в люмбду [this]... возможно, действительно, лучше в его случае [*this]?.. ?или неправильная передача функции в поток
- возможно, тут и теряет контроль... мне надо сильно потестить те коды, чтобы разобраться... разберусь ли?... но если вы своим Pro взглядом увидите bug - черканите please
0
|
|||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 05.04.2021, 19:33 | |||
|
Здесь надо следить за временем жизни объектов, которые ты передаёшь в поток, и понимать, что именно ты передаёшь по ссылке, а что по значению. Добавлено через 3 минуты Если ты передаёшь в поток что-то по ссылке или по указателю, то необходимо гарантировать, что поток завершиться раньше, чем будет уничтожен объект, на который ты ссылаешься.
1
|
|||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 05.04.2021, 19:48 | ||
|
Только выбрал для этого стандартный контейнер(да ещё и вектор, которому не "запретил" реаллокацию). Сделать такую очередь на базе стандартных контейнеров/адапторов не получится(без идиотизма). Хотя не сложно написать такую очередь(с раздельной блокировкой для "хвоста" и "головы") самостоятельно. Очереди на базе стандартных контейнеров должны полностью блокироваться на время любых операции, а для снижения времени блокировки и повышении безопасности по исключениям разумно использовать unique_ptr'ы(как вы заметили), если объекты не поддерживают noexcept move семантику. Всё остальное, что вы написали - не относится к проблемам того кода.
1
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||
| 05.04.2021, 19:50 [ТС] | |||||||
0
|
|||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 05.04.2021, 20:08 | |||
|
На сами объекты thread тоже никто не ссылается.
1
|
|||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||||
| 06.04.2021, 10:10 [ТС] | |||||||||||||
действительно, в многопоточности в норм. коде и проблем с вектором не возникает (тема: Многопоточное заполнение вектора векторов) и асинхронность нормально задействуется...Добавлено через 2 часа 16 минут несколько remarkable_things для async: 1) рекурсивный запуск асинхр. потоков
3) зацикливание отлова результата работы потоков, чтобы не блокировать код (хорошие объяснения на U++) 4) отлов исключений
std::launch::async enable asynchronous evaluation std::launch::deferred enable lazy evaluation 6) для U++ есть такой класс
Добавлено через 1 минуту ИТОГО: Основные вопросы, возникающие при старте знакомства с async и MT: - обходу блокировки при возвращениИ результата из fut.get() (что впрочем справедливо и для thread.join()) - выбросу исключений в основной поток, если что-то пойдёт не так *** ... всё-таки остаётся последний вопрос: раз cout и cerr у нас в разных потоках всегда в C/C++ -- не потеряю ли я чего (бросая не понятно куда исключения и результаты) -- в общем, нужен ли какой специальный hint (чтобы бросать и туда, и туда)... или синхронизации с cout И try{} catch(...){} для отлова исключений достаточно? сама отвечу: - думаю, что достаточно... лучше в run-time(чуть что поправят) Добавлено через 29 минут P.S. jthread (C++20) std::thread with support for auto-joining and cancellation
0
|
|||||||||||||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|
| 06.04.2021, 19:20 [ТС] | |
|
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|
| 10.04.2021, 16:21 [ТС] | |
|
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 10.04.2021, 16:22 | |
|
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|||||||||||
| 10.04.2021, 19:25 [ТС] | |||||||||||
|
чем просто cout - ДА (п.4 и п.8)
Однако все равно можно использовать cin / cout и достичь той же скорости, что и scanf / printf, включив следующие две строки в функцию main ():
Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
||
| 22.04.2021, 21:15 [ТС] | ||
|
P.S.
касательно сигнальных механизмов IPC (в частности семафора)
0
|
||
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
|
| 26.04.2021, 21:18 [ТС] | |
|
0
|
|
|
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
|
||
| 22.05.2021, 07:46 [ТС] | ||
|
p.s. если доберусь до разработки на Linux: Lib32gcc-10-dev-x32-cross Download for Linux (deb) Добавлено через 8 минут Debian vs Ubuntu Добавлено через 23 минуты topic "Установил Linux, как установить Qt" - здесь советуют Fedora (Red Hat) - рус.яз. Red Hat Enterprise Linux (платная)
0
|
||
| 22.05.2021, 07:46 | |
|
Помогаю со студенческими работами здесь
35
Семафор [C++] семафор Семафор Семафор
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|