Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Суть задачи в следующем: Есть поток, который получает данные, раз в 100 мс примерно. Есть воторой поток, который отображает данные в графическом виде. Как сделать так, чтобы при получении данных первым потоком, он давал команду второму потоку отобразить их? Я побывал так: поток, отображающий данные работает в бесконечном цикле, на каждом шаге цикла проверяет, пришли ли новые данные от потока получения или нет. Но, это не рационально..цикл требует ресурсов. Как лучше сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 10:11 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Medvedev_AКак лучше сделать? Ты бы хоть ОС назвал... В Windows, например "отображающий поток" это обычно главный поток, который поддерживает GUI и крутит цикл выборки сообщений. Следовательно наиболее естественный способ его уведомления - посылка сообщения через SendMessage или PostMessage. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 11:49 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Да, windows, спасибо попробую так, как вы указали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 12:23 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Medvedev_A, Эээ... Как бы указанный способ далеко не самый лучший. 0) ни в коем случае нельзя использовать SendMessage. SendMessageTimeout или аналоги, или postMessage. 1) обновлений может прийти несколько, но видимо показывать есть смысл только одно, последнее. Также обновление бессмысленно показывать, если в данный момент пользователь что-то делает — главный поток может либо вообще ничего не ответить, либо обновление вклинится посреди действий пользователя. Поэтому в идеале надо обновляться по таймеру или по idle. Читающий поток кладет нужные данные в "гнездо", и возводит флаг, что данные новые, главный поток в очередной раз выходит на iddle, проверяет флаг, и выполняет обновление. "гнездо" необходимо защищать. Ну и 100 миллисекунд — это очень часто. Это порядок времени кадровой развертки телевизора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 21:28 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZiv100 миллисекунд — это очень часто. Это порядок времени кадровой развертки телевизора. Бредишь. 100мс это 10fps. Кадровая у телевизора это 60fps. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 21:31 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovБредишь. 100мс это 10fps. Кадровая у телевизора это 60fps60/10 = 6 В порядок величины - да, уложился :) P.S. И как только винда успевает автоповтор клавиатуры и движения мыши обрабатывать ... Не иначе как секретные технологии хардкордных прогеров ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2013, 21:46 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
В окне сделать таймер. По приходу сообщения от процесса - ставить флаг, что данные появились. В обработчике таймера пересовывать. Частоту таймера можно регулировать, например UI. Т.е. пользоваетль сам сможет выбрать, как часто ему обновлять данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 01:37 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZiv100 миллисекунд — это очень часто. Это порядок времени кадровой развертки телевизора. Бредишь. 100мс это 10fps. Кадровая у телевизора это 60fps. Я говорил "порядок". Не 60 FPS, а 25. Это стандартное телевизионное значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 02:03 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivНе 60 FPS, а 25. Это стандартное телевизионное значение.У стандарта SECAM - 50 полукадров. 24 - только в кино. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 07:56 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovMasterZivНе 60 FPS, а 25. Это стандартное телевизионное значение.У стандарта SECAM - 50 полукадров. 24 - только в кино. Ну и чё? Это меняет что -то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 09:23 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivНу и чё? Это меняет что -то?Конкретные цифры - да, порядок величин - нет, постулат "посылать сообщения десять раз в секунду - очень часто" - всё равно остаётся сомнительным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 10:16 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Не посылать сообщения, а обновлять информацию. Я ж говорю, тут скорость поступления информации сравнима с максимальной скоростью, с которой глаз что-то может воспринимать, а наверное ещё и мозг что-то успевать сделать должен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 10:43 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ ж говорю, тут скорость поступления информации сравнима с максимальной скоростью, с которой глаз что-то может воспринимать, а наверное ещё и мозг что-то успевать сделать должен. Бедный мозг неспособен воспринимать 10 кадров в секунду? Автор же не сказал что представляют его "данные" и как они отображаются. Может, данные это одно целое число, а отображается это в виде ползущей точки как на осциллографе. Ты способен воспринимать информацию с осциллографа?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 11:17 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivа наверное ещё и мозг что-то успевать сделать должен. мозг - разный, 60 fps бывает недостаточно (не только в игрушках) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 11:45 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Н-да... Холивар однако. Про автора топика и вопрос уже забыли напрочь... Автору: читать http://msdn.microsoft.com/en-us/library/windows/desktop/ms682052(v=vs.85).aspx Бойцам: я бы вас понял, если бы обсуждали работу с таймером на микросекунды. А остальное все - бред и спор не о чём. Это не нагрузка даже на проц с тактовой в 20 мгц... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2013, 12:29 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
а вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 14:27 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Medvedev_Aкак это быстрее всего сделать? Если говорить о чистой скорости, то быстрее всего этого вообще не делать: обрабатывать их в том же потоке, где получены. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 14:30 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Medvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage? Ссылка на общие данные. Контроль доступа - мьютекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 14:30 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Medvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage? Вообще-то потоки специально придуманы, чтобы этого никогда не нужно было делать. Память у потоков одна и та же, ничего никуда посылать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 17:44 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
zMedvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage? Ссылка на общие данные. Контроль доступа - мьютекс. Между потоками лучше -- критическая секция. В windows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 17:45 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivzпропущено... Ссылка на общие данные. Контроль доступа - мьютекс. Между потоками лучше -- критическая секция. В windows. Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным. В чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи? Да и насчет того, что память у потоков одна и та же... В принципе - да, одни и те же мелкосхемы юзаются Но логически - это как напишешь. Потоки даже если это одни и те же методы одного и того же класса можно по разному организовать... Напр. никто не запрещает разместить данные непосредственно в самом методе (как один из примеров). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 18:00 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
авторМежду потоками лучше -- критическая секция. В windows. Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным. СОГЛАСЕН. Но в мире Windows мьютекс -- это то, что созадют CreteMutex, а неокрепшие умы не все знают, что есть ещё критические секции, и они -- тоже мьютексы. авторВ чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи? Быстрее. Вообще, если не нужно межпроцессное взаимодействие, то по умолчанию в WinXX надо использовать секции. авторДа и насчет того, что память у потоков одна и та же... В принципе - да, одни и те же мелкосхемы юзаются Но логически - это как напишешь. Потоки даже если это одни и те же методы одного и того же класса можно по разному организовать... Напр. никто не запрещает разместить данные непосредственно в самом методе (как один из примеров). Логически. У потоков. Память. Одна. Даже та, которая в методе одного потока, доступна (и слава Богу!) из другого потока. Поэтому я и пишу -- ПАМЯТЬ ОДНА. Потому что она одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 19:10 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Я запустил 2 независимых потока одного и того же метода. Массив (например) выделен в САМОМ МЕТОДЕ (читай фунуции), нет описателя в "заголовке класса". И ? Посмотри карту heap... Но может и не стоило этого писать, типа вредно для неокрепших умов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 20:20 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
zMasterZiv, Я запустил 2 независимых потока одного и того же метода. Массив (например) выделен в САМОМ МЕТОДЕ (читай фунуции), нет описателя в "заголовке класса". И ? Ну и что "И", это такая же память, как и любая другая. Передай ссылку на нее в другой поток как-то — будет доступна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 00:22 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
z, Ты из недоступности переменной делаешь вывод о недоступности памяти. Это неверно. Память и переменные — разные вещи, к сожалению. Переменная размещается в памяти, и может быть не видна где-то ни непосредственно, ни опосредованно, через ссылки, но даже в этом случае память этой переменной видна и доступна всем потокам данного процесса. А если на эту память, на эту переменную передать другому потоку ссылку, то вот она и будет видна... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 00:32 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
zMasterZivпропущено... Между потоками лучше -- критическая секция. В windows. Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным. В чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи? Критические секции и мьютексы в винде (первые только в винде и есть) объекты с совершенно различными характеристиками, первые - объекты пользовательского режима, вторые объекты ядра. Если вы бездумно будете взаимозаменять их получите либо постоянно загруженный проц, либо низкую производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 15:12 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_, А почему вы решили, что то что характеристики производительности зависят от того пользовательский это объект или ядерный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 15:59 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZiv, что есть "переменная" ? Слот в TLS - переменная или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 16:04 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskysherzod_, А почему вы решили, что то что характеристики производительности зависят от того пользовательский это объект или ядерный?Джеффри РИХТЕР "WINDOWS Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" Небольшой тест 12294042 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 16:11 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
m_Sla, Я вообще-то про другое спрашивал. Не про то, какая производительность, а про то как она зависит от того где находится объект синхронизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 16:38 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, От того, где находится объекты синхронизации зависит лишь будет переключаться контекст или нет при захвате критической секции или мьютекса. В случае использования объектов ядра (мьютекса) это приведет к переключению контекста, в случае с критическими секциями - нет. Поэтому, кто программирует на винде и не обременен между процессовой синхронизацией посредством именованных или неименованных мьютексов, используются критический секции для взаимоисключающей блокировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 17:10 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков, Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса. Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 17:27 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий Широков, Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса. Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали. В случае невозможности заблокировать ресурс посредством критической секции безусловно ты получишь переключение контекста, а вот в случае успеха - нет. Так что не руби с плеча, утверждая, что переключение контекста здесь "мимо". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 17:37 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий Широков, Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса. Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали.из Рихтера: "В этой главе мы рассмотрим, как синхронизировать потоки с помощью объектов ядра. Вы увидите, что такие объекты предоставляют куда больше возможностей, чем механизмы синхронизации в пользовательском режиме. В сущности, единственный их недостаток — меньшее быстродействие Дело в том, что при вызове любой из фун кций, упоминаемых в этой главе, поток должен перейти из пользовательского режи ма в режим ядра. А такой переход обходится очень дорого — в 1000 процессорных тактов на платформе x86 Прибавьте сюда еще и время, которое необходимо на вы полнение кода этих функций в режиме ядра." Так понимаю процессор с ring3 переключается на ring0, а потом назад. На этом время и теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 17:58 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
m_Sla, Я тут подумал, что переключение в ядро нужно не для реализации функционала мьютекса, а для защиты памяти ядра в которой находится мтьютекс от некорректных программ. А посколько такая защита по-любому нужна в многозадачных системах, то получается я был не прав и объекты синхронизации в ядре всегда будут иметь этот оверхед по сравнению с юзерскими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 18:28 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
На самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 22:04 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковAnatoly Moskovsky, ... Поэтому, кто программирует на винде и не обременен между процессовой синхронизацией посредством именованных или неименованных мьютексов, используются критический секции для взаимоисключающей блокировки. Другие этим тоже не обременены, критические секции это всего-лишь виндовая оболочка над возможностями interlocked функций, которые по сути аппаратные. В линуксе например аналог - futex (fast userspace mutex). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 22:07 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
MasterZivНа самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать. Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 13:31 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMasterZivНа самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать. Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует. Слой хендлов обеспечивает безопасность ядра от несанкционированного доступа к реальным данным. То о чем говоришь ты существовало ранее и от чего современные версии Windows ушли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 13:46 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков, Да никто никуда от этого не ушел. Например http://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 13:57 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковAnatoly Moskovskyпропущено... Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует. Слой хендлов обеспечивает безопасность ядра от несанкционированного доступа к реальным данным. То о чем говоришь ты существовало ранее и от чего современные версии Windows ушли. Да и вряд ли переключение в контекст ядра связано исключительно с безопасностью. Если при спин-блокировке потоки еще смогут разрулиться без участия ядра (в частности планировщика), то при мьютексе этого никак не достичь кодом юзерспейса - нужно участие планировщика, нужно участие алгоритма очереди ожидания (хотя при мьютексе он вырождается конечно, но все же), чтобы уравнивать шансы на захват блокировки, да и много чего еще там ведь происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:00 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_, Я отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:20 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, И что этот пост должен продемонстрировать, что имея легальный API можно получить соответствие между объектом и его HANDLE-ом? А что с этим кто-то спорил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:22 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковAnatoly Moskovsky, И что этот пост должен продемонстрировать, что имея легальный API можно получить соответствие между объектом и его HANDLE-ом? А что с этим кто-то спорил? Код: plaintext 1. AllocationBase это адрес в процессе, а HMODULE это хендл. Между ними не просто есть соответствие. Это одно и тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:29 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Кроме того, в том посе опровергается утверждение "существовало ранее и от чего современные версии Windows ушли" и показано на примере HMODULE что был как раз обратный процесс - изначально HMODULE был просто числом, а в современных версиях стал адресом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:33 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API . Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:37 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API . Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. Даже в случае междупроцессного взаимодействия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:50 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКроме того, в том посе опровергается утверждение "существовало ранее и от чего современные версии Windows ушли" и показано на примере HMODULE что был как раз обратный процесс - изначально HMODULE был просто числом, а в современных версиях стал адресом. Соглашусь, что в данном конкретном случае, это так. Но это, скорее, исключение, чем правило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 14:54 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковAnatoly MoskovskyКроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. Даже в случае междупроцессного взаимодействия? Да. Например выше приводили futex. На основе этого примитива можно реализовать быстрый мьютекс в юзерспейсе (в разделяемой памяти для межпроцессного мьютекса). Уверен что под виндой вполне можно было реализовать аналогичный АПИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:00 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий Широковпропущено... Даже в случае междупроцессного взаимодействия? Да. Например выше приводили futex. На основе этого примитива можно реализовать быстрый мьютекс в юзерспейсе (в разделяемой памяти для межпроцессного мьютекса). Уверен что под виндой вполне можно было реализовать аналогичный АПИ. Доступ к разделяемой памяти надо синхронизировать, а для этого надо нечто уровня ядра. А раз уровня ядра, вынь да полож накладные расходы на переключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:08 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковДоступ к разделяемой памяти надо синхронизировать, да Анатолий Широкова для этого надо нечто уровня ядра. нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:12 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий Широкова для этого надо нечто уровня ядра. нет не верю (c) Станиславский ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:18 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Вот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой. (В терминах существующего АПИ) Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг). При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена. Если не удается, то юзер вызывает WaitForSO для ивента. При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент. Все. Когда нет конкурентов юзер вообще не переключается в ядро. Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:22 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Да, забыл написать - в спинлоке хранится еще кол-во ждущих, чтобы избежать ненужных сигналов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:24 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API . Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. С таким же эффектом можно сказать, для свободного полета человека нет никаких преград кроме законов физики. Слишком общо. Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе? А именно обеспечение равных шансов захвата всеми конкурирующими потоками (при многократном захвате), таймауты, сигнализация, да и вообще все что отличает его от спин-блокировки? Кто будет сообщать другим потокам\процессам о том что мьютекс освободился? Кто будет принимать решение какой из ждущих потоков будить? Как вообще планировать задачи (потоки, процессы) из юзерспейс кода? Поток\процесс пытается захватить мьютекс. Вызывается какой-нибудб interlocked_exchange и поток понимает что - облом мьютекс уже захвачен. Вопрос что он должен делать? Видится три варианта 1. Дико exch-ить пока не получится захватить. 2. Делать №1 с какой-либо периодичностью с засыпаниями (что неизбежно приводит к вызову контекста ядра, так как идет вызов планировщика). Тем не менее 1, 2 - это варианты спин блокировки, и речь не о них, речь ведь о конкретном объекте ядра винды - Mutex Object. 3. Нужно как-то попросить ядро чтобы она сообщила когда потоку можно будет попробовать захватить мьютекс еще раз и тут же заснуть. Заметили словосочетание попросить ядро? А там таких молящих о помощи еще с десяток. Их надо где-то держать. Их надо планировать. Равномерно давать подержать мьютекс. Пинать по таймауту. А если еще учесть что мьютексом владеет захвативший поток, следить за ним, чтобы он не помер вместе с мьютексом, а если он все таки умудрится это сделать, пометить мьютекс как свободный. Будет интересно послушать ктО это все будет делать как не ядро и причем тут безопасность.. Говорю без сарказма, потому-что есть много док которые надо прочитать, где предпринимаются попытки найти ктО, поэтому будет действительно интересно и полезно послушать развернутые ответы на эти вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:35 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой. (В терминах существующего АПИ) Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг). При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена. Если не удается, то юзер вызывает WaitForSO для ивента. При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент. Все. Когда нет конкурентов юзер вообще не переключается в ядро. Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок. Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:38 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе? А кто сказал что надо весь функционал реализовывать в юзерспейсе? Мы с чего начали? С того что крит.секция быстрее мьютекса. Что - секция прямо вся в юзерспейсе выполняется? Нет. Там где это требуется она переключается в ядро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:40 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться. А то что я привел - это именно межпроцессный мьютекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:42 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:49 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskysherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали. У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться. А то что я привел - это именно межпроцессный мьютекс. Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. ЕМНИП подобный функцонал приводится у Рихтера в качестве примера, класс Optex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 15:55 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
?Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть. В таком случае это еще одно подтвердение, что только безопасность мешает реализовать межпроцессный мьютекс в юзерспейсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 16:01 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
sherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. В той реализации что я привел соблюдаются все эти требования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 16:04 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskysherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. В той реализации что я привел соблюдаются все эти требования. А как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 19:54 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? Так сам спинлок и обеспечивает это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:17 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует? Так сам спинлок и обеспечивает это. Это утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:33 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах. http://ru.wikipedia.org/wiki/Spinlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 20:47 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным? Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах. http://ru.wikipedia.org/wiki/Spinlock Хорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:21 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен? Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?". Для работы спинлока нет разницы разделяемая это память, или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:31 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как? Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен? Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?". Для работы спинлока нет разницы разделяемая это память, или нет. Нет, не ставлю. Просто я пытаюсь понять. Есть два процесса, каждый со своим адресным пространством. Спин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:34 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий Широковспин должен работать с неким адресом общим для двух процессов Кстати виртуальный адрес размещения спинлока необязательно совпадает в разных процессах, а физический - да, общий. Но физические адреса никого не интересуют. Есть примитив "разделяемая память" - он реализует соответствующее размещение спинлока, без заботы о физ. адресах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:37 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:45 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyАнатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет. Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками. Вот это и вызываем у меня большие сомнения. Для использования разделяемой памяти для помещения туда спинлока необходимо знать детали его реализации. Если взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:51 |
|
||
|
взаимодействие между потоками, сигнал из одного потока в другой
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЕсли взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов. Вирт. адрес и не должен совпадать. А совпадение физ. адресов обеспечивается использованием разделяемой памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2013, 21:55 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2020097]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 191ms |

| 0 / 0 |
