|
|
|||||||||||
Вопрос по работе WaitForSingleObject23.10.2010, 12:01. Показов 15288. Ответов 54
Метки нет (Все метки)
Постановка задачи следующая. Есть основной процесс, который заведует отображением GUI и есть поток, который делает вычисления. Поток в процессе вычислений периодически должен отдавать результат главному процессу, чтобы тот отобразил результат на GUI. Т.е. схематично процесс работы выглядит так:
Я предполагал, что WaitForSingleObject ожидает освобождения mutex'а, а потом запирает его. Предположение росло от того, что пока эту функцию я использовал только в тех случаях, когда mutex запирается и освобождается внутри одного и того же потока. В данном же случае имеем ситуацию, когда mutex запирается в одном потоке, а освобождается в другом. Для подтверждения неправомочности моего предположения достаточно написать исходник, в котором два раза подряд бы запускалось WaitForSingleObject. Если бы моё предположение было верно, то на втором запуске мы бы начали висеть, но этого не происходит. Вопросы. 1. Просьба пояснить, что конкретно делает WaitForSingleObject. Без ссылок на MSDN и учебники, а своими словами. Чтобы было понятно, почему работает схема, когда mutex запирается и освобождается в одном и том же потоке, но не работает схема, когда это делается в разных потоках 2. Какими интерфейсами правильно осуществить желаемую схему работы
0
|
|||||||||||
| 23.10.2010, 12:01 | |
|
Ответы с готовыми решениями:
54
Вопрос по работе с файлами |
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 24.10.2010, 17:12 | |
|
Evg, прямо интересно стало. Может опишите всю задачу и на чем ее рисуете (Pascal / CPP / кака-то экзотика).
0
|
|
|
|
|||
| 24.10.2010, 17:18 [ТС] | |||
|
0
|
|||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 24.10.2010, 17:19 | |
|
да можно что угодно скрутить, главное понять, что нужно сделать
![]() я не очень понимаю, что требуется нужно чтобы было несколько потоков читающих (aka читатели), и один поток пишуший (aka писатель) при этом пока писатель пишет - никто не читает когда писатель не пишет - читатели могут иметь вперемешку доступ к данным, не ограничивая друг друга ?
0
|
|
|
|
|||
| 24.10.2010, 17:41 [ТС] | |||
|
Но там много всякой своей специфики, а потому чтобы не углубляться в неё, привёл пример-аналог в посте #22 Добавлено через 2 минуты alex_x_x, ну вот как раз в посте #22 пример-аналог. Дополнительно к вопросу про семафоры могу сказать, что главный процесс временами тоже может смотреть в какое-нибудь устройство и ему нужно будет точно так же выдать данные на печать. Хочется всю печать локализовать в интерфейсе типа PrintData (string), и чтобы вся шайтан-арба была запрятана внутри и не зависела от количества потоков (да и работала бы в варианте, когда вообще потоков нет, а работа с каждым устройством шла бы последовательно и по очереди) Добавлено через 15 минут Добавлено через 1 минуту Локальный итог. Поставленная задача была разрешена при помощи двух семафоров. Но какое-то внутреннее чутьё мне подсказывает, что можно было бы обойтись и одним объектом синхронизации. Т.е. дальнейший разбор полётов уже скорее ради научного интереса
0
|
|||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
||||||
| 24.10.2010, 23:41 | ||||||
|
Не знаю, криво, все, конечно, и наспех, но вот для консольной версии как я вижу читать/писать многими потоками в общую переменную. Сначала рисовал Interlocked, но, пожалуй что использование мьютекса надежнее.
Дико извиняюсь, но _endthread() надо, конечно заменить на _endthreadex() Идиотство - это уже диагноз... Добавлено через 2 часа 2 минуты Мля! А ведь работает-то крайне неустойчиво...
0
|
||||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|||||||
| 25.10.2010, 00:32 | |||||||
|
вот еще вариант, может поможет,
Но стоит убрать Sleep в начале функции потока - и пошла мешанина в буфере. Данный факт объяснить никак и ничем не могу. На сегодня это финал.
0
|
|||||||
|
|
||||||||||||||||
| 25.10.2010, 14:46 [ТС] | ||||||||||||||||
Вот пример на linux'е:
0
|
||||||||||||||||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
||
| 25.10.2010, 17:26 | ||
|
Короче, набросал вот сегодня еще пару вариантов, может глянете. На мой непросвещенный взгляд лучше уж CPU пусть впустую крутит Interlocked какое-там время, чем заставлять его ерзать между User/Kernel. Хотя, в общем случае, основная проблема не в доступе к общему ресурсу - для этого достаточно одной-единственной критической секции, а в разруливании ситуации нехватки места в общем буфере. И опять все вернулось к динамическому распределению памяти... Хотя... Если применить какой-нить хитрый распределитель, может оно и не так страшно получится? Скажем, много писателей рисуют свои даные ну хотя бы в очередь. Один анализатор эти данные обрабатывает, помечая нужные/ненужные. А один читатель после берет эти данные и удаляет их из очереди. ну и в качестве PS: я, конечно, ну очень далеко не эксперт в области многопоточности, и, наверное, поэтому всеми правдами-неправдами, стараюсь ее избежать. (И зачастую это получается.) Применяю только в качестве какой-нить сугубо вспомогательной/отладочной фичи. А в основу работы - ни-ни...
0
|
||
|
|
||
| 25.10.2010, 17:38 [ТС] | ||
|
kukuruku310, твой архив под линухом что-то не открывается. Попробую дома под виндой. Но я подозреваю, что там очередной наноконцепт
В то время, как в примере из поста #13 всё чётко понятно и работает (правда я не понимаю почему, потому что до сих пор не понял, что делает WaitForSingleObject)По поводу потоков - в моей программе нужно одновременно качать данные с нескольких сайтов. Я не вижу среди простых реализаций что-либо вменяемое, кроме как делать загрузки из инета в отдельных потоках, потому как если загрузки делать в главном потоке, то программа будет постоянно "подвисать" из-за тормозов в сети. А перекладывать на пользователя проблеммы программиста - это неправильно Добавлено через 1 минуту
0
|
||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 25.10.2010, 17:57 | |
|
странно, паковал как всегда.
насчет наноконцепта-вполне возможно, просто пытаюсь подкинуть идею... Но не согласен по поводу переключения User/Kernel. Критические секции и Interlocked-функции выполняются без выхода из User-mode, поэтому и (в примере 2) старался ими обойтись. А по поводу WaitForSingleObject - как я понял - ждет освобождения какого-то объекта, если дождалась за отведеное время - возвращает 0, блокирую при этом перед своим выходом этот объект, или taim-out, или еще-что-то, если этот объект был кем-то некорректно освобожден. так я понял Рихтера и MSDN. А уж что там на самом деле внутри.... И еще добавлю - если освобождающий буфер поток (читатель) работает менее/или равно приоритетно, чем куча писателей (как и должно быть), то без динамики выделения памяти все равно не обойтись. И еще идея: куча писателей могут писать данные не в память, а во временные файлы в каком-то определенном каталоге. А все остальные их оттуда забирают. Если прийти к соглашению о какой-то минимально/максимальной порции данных в файле, то вполне реально обойтись без всяких потоков. А запись/чтение с локального диска все равно будет быстрее любого самого скоростного интернета.
0
|
|
|
|
|
| 25.10.2010, 18:10 [ТС] | |
|
> то вполне реально обойтись без всяких потоков
Как? Работать ручками через TCP-сокет с таймаутом по 0.01 сек (потому что в противном случае программа будет висеть в процессе чтения данных из сокета)?
0
|
|
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 25.10.2010, 18:16 | |
|
0
|
|
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
||
| 25.10.2010, 18:37 | ||
|
0
|
||
|
|
||
| 25.10.2010, 18:59 [ТС] | ||
|
0
|
||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
|
| 25.10.2010, 19:09 | |
|
Evg, я еще раз говорю, что выбор за Вами, но попробуйте реализовать (и прогнать во всевозможных режимах) то, что написано в №12, с учетом того, чтобы читатель никогда не терял данные, чтобы читатель никогда не блокировал ни одного писателя и при этом использовался фиксированный буфер ограниченного размера. Для всего, что написано в #12, вполне достаточно одной критич.секции, которая не даст обратиться к буферу одновременно двум потокам.
Все, я выхожу из темы, все равно других идей у меня нет.
0
|
|
|
|
|||
| 25.10.2010, 20:24 [ТС] | |||
|
0
|
|||
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
|
||
| 25.10.2010, 22:28 | ||
|
И какая тут многопоточность? Зачем вообще заводить основной поток, если всю работу с тем же успехом сделают сами писатели, помещая результат не в буфер, а посылая его напрямую куда надо. Долго выводить результат? Так ожидание от системы разрешения работать и потом вывод - еще дольше. Зачем там семафор, а тем более 2 - непонятно. Вполне достаточно единственной и куда более легковесной критич.секции. Ну а по поводу "тыканья пальцем" - так в последнем вложении пример 2 как раз и использует критическую секцию, а потоки блокируются только если буфер переполняется оттого, что выводящий не успевает его освобождать. Ну хорошо, следуя примеру то ли 12, то ли 13, примерно так: создание - InitializeCriticalSectionAndSpinCount захват - EnterCriticalSection освобождение - LeaveCriticalSection удаление – DeleteCriticalSection итого main InitializeCriticalSectionAndSpinCount работа DeleteCriticalSection поток и главный поток EnterCriticalSection ... LeaveCriticalSection проверял в отличие от 12/13 все потоки имеют равные права. Но основная проблема не в этом - об этом я уже сказал.
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 25.10.2010, 23:08 | |
|
kukuruku310, критическая секция не учитывает, что можно читать, когда ничего не записано, а так да
0
|
|
| 25.10.2010, 23:08 | |
|
Вопрос по работе со списками Вопрос по работе со списками Вопрос по работе с TTimer Вопрос о работе с консолью Вопрос по лабораторной работе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|