powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / взаимодействие между потоками, сигнал из одного потока в другой
73 сообщений из 73, показаны все 3 страниц
взаимодействие между потоками, сигнал из одного потока в другой
    #38323711
Medvedev_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Суть задачи в следующем: Есть поток, который получает данные, раз в 100 мс примерно. Есть воторой поток, который отображает данные в графическом виде. Как сделать так, чтобы при получении данных первым потоком, он давал команду второму потоку отобразить их?
Я побывал так: поток, отображающий данные работает в бесконечном цикле, на каждом шаге цикла проверяет, пришли ли новые данные от потока получения или нет. Но, это не рационально..цикл требует ресурсов. Как лучше сделать?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38323866
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_AКак лучше сделать?
Ты бы хоть ОС назвал... В Windows, например "отображающий поток" это обычно главный поток,
который поддерживает GUI и крутит цикл выборки сообщений. Следовательно наиболее
естественный способ его уведомления - посылка сообщения через SendMessage или PostMessage.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38323920
Medvedev_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, windows, спасибо попробую так, как вы указали.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324799
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_A,

Эээ... Как бы указанный способ далеко не самый лучший.

0) ни в коем случае нельзя использовать SendMessage. SendMessageTimeout или аналоги, или postMessage.

1) обновлений может прийти несколько, но видимо показывать есть смысл только одно, последнее. Также обновление бессмысленно показывать, если в данный момент пользователь что-то делает — главный поток может либо вообще ничего не ответить, либо обновление вклинится посреди действий пользователя.
Поэтому в идеале надо обновляться по таймеру или по idle. Читающий поток кладет нужные данные в "гнездо", и возводит флаг, что данные новые, главный поток в очередной раз выходит на iddle, проверяет флаг, и выполняет обновление.
"гнездо" необходимо защищать.

Ну и 100 миллисекунд — это очень часто.
Это порядок времени кадровой развертки телевизора.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324805
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv100 миллисекунд — это очень часто.
Это порядок времени кадровой развертки телевизора.
Бредишь. 100мс это 10fps. Кадровая у телевизора это 60fps.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324819
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovБредишь. 100мс это 10fps. Кадровая у телевизора это 60fps60/10 = 6
В порядок величины - да, уложился :)

P.S. И как только винда успевает автоповтор клавиатуры и движения мыши обрабатывать ...
Не иначе как секретные технологии хардкордных прогеров ...
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324918
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В окне сделать таймер. По приходу сообщения от процесса - ставить флаг, что данные появились. В обработчике таймера пересовывать. Частоту таймера можно регулировать, например UI. Т.е. пользоваетль сам сможет выбрать, как часто ему обновлять данные.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324928
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZiv100 миллисекунд — это очень часто.
Это порядок времени кадровой развертки телевизора.
Бредишь. 100мс это 10fps. Кадровая у телевизора это 60fps.


Я говорил "порядок".

Не 60 FPS, а 25. Это стандартное телевизионное значение.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38324975
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе 60 FPS, а 25. Это стандартное телевизионное значение.У стандарта SECAM - 50 полукадров.
24 - только в кино.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325014
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovMasterZivНе 60 FPS, а 25. Это стандартное телевизионное значение.У стандарта SECAM - 50 полукадров.
24 - только в кино.

Ну и чё?
Это меняет что -то?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325070
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и чё?
Это меняет что -то?Конкретные цифры - да, порядок величин - нет, постулат "посылать сообщения десять раз в секунду - очень часто" - всё равно остаётся сомнительным.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325113
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Не посылать сообщения, а обновлять информацию.
Я ж говорю, тут скорость поступления информации сравнима с максимальной скоростью, с которой глаз что-то может воспринимать, а наверное ещё и мозг что-то успевать сделать должен.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325182
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ ж говорю, тут скорость поступления информации сравнима с максимальной
скоростью, с которой глаз что-то может воспринимать, а наверное ещё и мозг что-то успевать
сделать должен.
Бедный мозг неспособен воспринимать 10 кадров в секунду? Автор же не сказал что
представляют его "данные" и как они отображаются. Может, данные это одно целое число, а
отображается это в виде ползущей точки как на осциллографе. Ты способен воспринимать
информацию с осциллографа?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325250
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivа наверное ещё и мозг что-то успевать сделать должен.
мозг - разный, 60 fps бывает недостаточно (не только в игрушках)
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38325336
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
Н-да... Холивар однако. Про автора топика и вопрос уже забыли напрочь...

Автору: читать http://msdn.microsoft.com/en-us/library/windows/desktop/ms682052(v=vs.85).aspx

Бойцам: я бы вас понял, если бы обсуждали работу с таймером на микросекунды. А остальное все - бред и спор не о чём.
Это не нагрузка даже на проц с тактовой в 20 мгц...
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38326830
Medvedev_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38326834
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_Aкак это быстрее всего сделать?
Если говорить о чистой скорости, то быстрее всего этого вообще не делать: обрабатывать их
в том же потоке, где получены.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38326836
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
Medvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage?
Ссылка на общие данные. Контроль доступа - мьютекс.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327182
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage?

Вообще-то потоки специально придуманы, чтобы этого никогда не нужно было делать.
Память у потоков одна и та же, ничего никуда посылать не надо.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327184
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zMedvedev_Aа вообще, если я хочу из одного потока послать данные в другой...как это быстрее всего сделать? SendMessage?
Ссылка на общие данные. Контроль доступа - мьютекс.

Между потоками лучше -- критическая секция. В windows.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327213
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
MasterZivzпропущено...

Ссылка на общие данные. Контроль доступа - мьютекс.

Между потоками лучше -- критическая секция. В windows.

Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным.
В чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи?
Да и насчет того, что память у потоков одна и та же... В принципе - да, одни и те же мелкосхемы юзаются
Но логически - это как напишешь. Потоки даже если это одни и те же методы одного и того же класса можно по разному организовать... Напр. никто не запрещает разместить данные непосредственно в самом методе (как один из примеров).
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327302
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМежду потоками лучше -- критическая секция. В windows.

Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным.

СОГЛАСЕН.
Но в мире Windows мьютекс -- это то, что созадют CreteMutex, а неокрепшие умы не все знают, что есть ещё критические секции, и они -- тоже мьютексы.

авторВ чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи?

Быстрее. Вообще, если не нужно межпроцессное взаимодействие, то по умолчанию в WinXX надо использовать секции.

авторДа и насчет того, что память у потоков одна и та же... В принципе - да, одни и те же мелкосхемы юзаются
Но логически - это как напишешь. Потоки даже если это одни и те же методы одного и того же класса можно по разному организовать... Напр. никто не запрещает разместить данные непосредственно в самом методе (как один из примеров).

Логически. У потоков. Память. Одна. Даже та, которая в методе одного потока, доступна (и слава Богу!) из другого потока.
Поэтому я и пишу -- ПАМЯТЬ ОДНА. Потому что она одна.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327356
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
MasterZiv,

Я запустил 2 независимых потока одного и того же метода. Массив (например) выделен в САМОМ МЕТОДЕ (читай фунуции), нет описателя в "заголовке класса". И ?
Посмотри карту heap...

Но может и не стоило этого писать, типа вредно для неокрепших умов...
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327491
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zMasterZiv,

Я запустил 2 независимых потока одного и того же метода. Массив (например) выделен в САМОМ МЕТОДЕ (читай фунуции), нет описателя в "заголовке класса". И ?


Ну и что "И", это такая же память, как и любая другая. Передай ссылку на нее в другой поток как-то — будет доступна.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38327498
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z,

Ты из недоступности переменной делаешь вывод о недоступности памяти. Это неверно. Память и переменные — разные вещи, к сожалению. Переменная размещается в памяти, и может быть не видна где-то ни непосредственно, ни опосредованно, через ссылки, но даже в этом случае память этой переменной видна и доступна всем потокам данного процесса. А если на эту память, на эту переменную передать другому потоку ссылку, то вот она и будет видна...
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328248
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zMasterZivпропущено...
Между потоками лучше -- критическая секция. В windows.
Критическая секция - вариант мьютекса, где по сути невозможно выполнение какого то кода одновременно несколькими потоками, напр. доступа к данным.
В чем будет преимущество по сравнению с "классическим" вариантом мьютекса для данной задачи?
Критические секции и мьютексы в винде (первые только в винде и есть) объекты с совершенно различными характеристиками, первые - объекты пользовательского режима, вторые объекты ядра. Если вы бездумно будете взаимозаменять их получите либо постоянно загруженный проц, либо низкую производительность.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328331
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_,

А почему вы решили, что то что характеристики производительности зависят от того пользовательский это объект или ядерный?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328338
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
что есть "переменная" ? Слот в TLS - переменная или нет?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328350
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskysherzod_,
А почему вы решили, что то что характеристики производительности зависят от того пользовательский это объект или ядерный?Джеффри РИХТЕР
"WINDOWS Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows"

Небольшой тест 12294042
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328390
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

Я вообще-то про другое спрашивал.
Не про то, какая производительность, а про то как она зависит от того где находится объект синхронизации.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328432
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

От того, где находится объекты синхронизации зависит лишь будет переключаться контекст или нет при захвате критической секции или мьютекса. В случае использования объектов ядра (мьютекса) это приведет к переключению контекста, в случае с критическими секциями - нет. Поэтому, кто программирует на винде и не обременен между процессовой синхронизацией посредством именованных или неименованных мьютексов, используются критический секции для взаимоисключающей блокировки.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328461
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков,

Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса.
Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328482
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий Широков,

Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса.
Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали.

В случае невозможности заблокировать ресурс посредством критической секции безусловно ты получишь переключение контекста, а вот в случае успеха - нет. Так что не руби с плеча, утверждая, что переключение контекста здесь "мимо".
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328507
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий Широков,
Переключение контекста - это мимо, оно не объясняет почему секция быстрее - секция точно также умеет усыплять ждущий поток - и в этом случае будет переключение контекста, ничем не отличающееся от межпроцессного мьютекса.
Быстрее она не потому что создается в юзерспейсе, а потому что имеет ряд оптимизаций, которые точно также могли бы внести в мьютекс, но не стали.из Рихтера:
"В этой главе мы рассмотрим, как синхронизировать потоки с помощью объектов ядра. Вы увидите, что такие объекты предоставляют куда больше возможностей, чем механизмы синхронизации в пользовательском режиме. В сущности, единственный их недостаток — меньшее быстродействие Дело в том, что при вызове любой из фун кций, упоминаемых в этой главе, поток должен перейти из пользовательского режи ма в режим ядра. А такой переход обходится очень дорого — в 1000 процессорных тактов на платформе x86 Прибавьте сюда еще и время, которое необходимо на вы полнение кода этих функций в режиме ядра."

Так понимаю процессор с ring3 переключается на ring0, а потом назад. На этом время и теряется.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328544
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

Я тут подумал, что переключение в ядро нужно не для реализации функционала мьютекса, а для защиты памяти ядра в которой находится мтьютекс от некорректных программ.
А посколько такая защита по-любому нужна в многозадачных системах, то получается я был не прав и объекты синхронизации в ядре всегда будут иметь этот оверхед по сравнению с юзерскими.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328743
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38328744
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковAnatoly Moskovsky,
... Поэтому, кто программирует на винде и не обременен между процессовой синхронизацией посредством именованных или неименованных мьютексов, используются критический секции для взаимоисключающей блокировки. Другие этим тоже не обременены, критические секции это всего-лишь виндовая оболочка над возможностями interlocked функций, которые по сути аппаратные. В линуксе например аналог - futex (fast userspace mutex).
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329293
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНа самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать.
Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329326
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivНа самом деле почему мьютекс сложно оптимизировать — по-моему так вполне очевидно, мьютекс для приложения — это только хэндл, псевдоуказатель, а данных у приложения нет вообще, и чтобы что-то с ним сделать, нужно уйти в код операционки, где какие-то данные мьютекса есть. А критическая секция наоборот уже в себе содержит данные, это обычная с-структура. Приложение само может с ней что-то сделать.
Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует.

Слой хендлов обеспечивает безопасность ядра от несанкционированного доступа к реальным данным. То о чем говоришь ты существовало ранее и от чего современные версии Windows ушли.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329347
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков,

Да никто никуда от этого не ушел.
Например http://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329359
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковAnatoly Moskovskyпропущено...
Оптимизировать как раз можно - разместить мьютекс в разделяемую память и исчезнет необходимость на каждый чих в ядро переключаться. В винде есть куча хендлов, которые по сути являются адресами в юзерском процессе. Т.е. такая практика существует.
Слой хендлов обеспечивает безопасность ядра от несанкционированного доступа к реальным данным. То о чем говоришь ты существовало ранее и от чего современные версии Windows ушли. Да и вряд ли переключение в контекст ядра связано исключительно с безопасностью. Если при спин-блокировке потоки еще смогут разрулиться без участия ядра (в частности планировщика), то при мьютексе этого никак не достичь кодом юзерспейса - нужно участие планировщика, нужно участие алгоритма очереди ожидания (хотя при мьютексе он вырождается конечно, но все же), чтобы уравнивать шансы на захват блокировки, да и много чего еще там ведь происходит.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329405
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_,

Я отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API .
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329409
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

И что этот пост должен продемонстрировать, что имея легальный API можно получить соответствие между объектом и его HANDLE-ом? А что с этим кто-то спорил?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329423
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковAnatoly Moskovsky,

И что этот пост должен продемонстрировать, что имея легальный API можно получить соответствие между объектом и его HANDLE-ом? А что с этим кто-то спорил?
Код: plaintext
1.
(HMODULE)mbi.AllocationBase


AllocationBase это адрес в процессе, а HMODULE это хендл.
Между ними не просто есть соответствие. Это одно и тоже.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329429
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, в том посе опровергается утверждение "существовало ранее и от чего современные версии Windows ушли" и показано на примере HMODULE что был как раз обратный процесс - изначально HMODULE был просто числом, а в современных версиях стал адресом.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329441
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API .
Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329479
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API .
Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе.

Даже в случае междупроцессного взаимодействия?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329488
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКроме того, в том посе опровергается утверждение "существовало ранее и от чего современные версии Windows ушли" и показано на примере HMODULE что был как раз обратный процесс - изначально HMODULE был просто числом, а в современных версиях стал адресом.

Соглашусь, что в данном конкретном случае, это так. Но это, скорее, исключение, чем правило.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329510
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковAnatoly MoskovskyКроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе.
Даже в случае междупроцессного взаимодействия?
Да.
Например выше приводили futex. На основе этого примитива можно реализовать быстрый мьютекс в юзерспейсе (в разделяемой памяти для межпроцессного мьютекса).
Уверен что под виндой вполне можно было реализовать аналогичный АПИ.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329525
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий Широковпропущено...

Даже в случае междупроцессного взаимодействия?
Да.
Например выше приводили futex. На основе этого примитива можно реализовать быстрый мьютекс в юзерспейсе (в разделяемой памяти для межпроцессного мьютекса).
Уверен что под виндой вполне можно было реализовать аналогичный АПИ.

Доступ к разделяемой памяти надо синхронизировать, а для этого надо нечто уровня ядра. А раз уровня ядра, вынь да полож накладные расходы на переключение.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329532
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковДоступ к разделяемой памяти надо синхронизировать,
да Анатолий Широкова для этого надо нечто уровня ядра. нет
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329541
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий Широкова для этого надо нечто уровня ядра.
нет


не верю (c) Станиславский
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329546
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой.
(В терминах существующего АПИ)

Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг).
При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена.
Если не удается, то юзер вызывает WaitForSO для ивента.
При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент.

Все.
Когда нет конкурентов юзер вообще не переключается в ядро.

Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329553
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл написать - в спинлоке хранится еще кол-во ждущих, чтобы избежать ненужных сигналов.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329569
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковЯ отвечал на конкретный пост относительно предложения приоткрыть завесу "потрохов" объектов ядра для клиентского кода и невозможность это сделать в контексте обеспечения безопасности ядра, кроме как через легальный API. Ясно, что в случае мьютексов надо было бы перенести на пользовательский уровень и много чего другого для обеспечения имитации функционала API .
Кроме безопасности нет никаких преград для реализации мьютекса в юзерспейсе. С таким же эффектом можно сказать, для свободного полета человека нет никаких преград кроме законов физики. Слишком общо.

Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе? А именно обеспечение равных шансов захвата всеми конкурирующими потоками (при многократном захвате), таймауты, сигнализация, да и вообще все что отличает его от спин-блокировки? Кто будет сообщать другим потокам\процессам о том что мьютекс освободился? Кто будет принимать решение какой из ждущих потоков будить? Как вообще планировать задачи (потоки, процессы) из юзерспейс кода?

Поток\процесс пытается захватить мьютекс. Вызывается какой-нибудб interlocked_exchange и поток понимает что - облом мьютекс уже захвачен. Вопрос что он должен делать? Видится три варианта

1. Дико exch-ить пока не получится захватить.
2. Делать №1 с какой-либо периодичностью с засыпаниями (что неизбежно приводит к вызову контекста ядра, так как идет вызов планировщика).

Тем не менее 1, 2 - это варианты спин блокировки, и речь не о них, речь ведь о конкретном объекте ядра винды - Mutex Object.

3. Нужно как-то попросить ядро чтобы она сообщила когда потоку можно будет попробовать захватить мьютекс еще раз и тут же заснуть. Заметили словосочетание попросить ядро? А там таких молящих о помощи еще с десяток. Их надо где-то держать. Их надо планировать. Равномерно давать подержать мьютекс. Пинать по таймауту. А если еще учесть что мьютексом владеет захвативший поток, следить за ним, чтобы он не помер вместе с мьютексом, а если он все таки умудрится это сделать, пометить мьютекс как свободный.

Будет интересно послушать ктО это все будет делать как не ядро и причем тут безопасность.. Говорю без сарказма, потому-что есть много док которые надо прочитать, где предпринимаются попытки найти ктО, поэтому будет действительно интересно и полезно послушать развернутые ответы на эти вопросы.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329575
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот в общих чертах как мог бы выглядеть юзерспейс мьютекс под виндой.
(В терминах существующего АПИ)
Создается именованный объект Event и в разделяемой памяти создается спинлок (атомарный флаг).
При блокировке юзер сначала пытается блокировать спинлок, если удается - операция завершена.
Если не удается, то юзер вызывает WaitForSO для ивента.
При разблокировке, юзер разблокирует спинлок и сигнализирует в ивент.
Все.
Когда нет конкурентов юзер вообще не переключается в ядро.
Единственная проблема - безопасность. Другие юзеры могуд повредить спинлок. Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329578
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_Если речь все еще идет о конкретном виндовом объекте ядра Mutex Object, то как можно реализовать весь его функционал в юзерспейсе?
А кто сказал что надо весь функционал реализовывать в юзерспейсе?
Мы с чего начали? С того что крит.секция быстрее мьютекса.
Что - секция прямо вся в юзерспейсе выполняется? Нет. Там где это требуется она переключается в ядро.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329581
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали.
У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться.
А то что я привел - это именно межпроцессный мьютекс.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329595
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329607
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskysherzod_Вы только что изобрели CRITICAL_SECTION. О разнице между ним и Mutex Object вобщем-то и толковали.
У секций нет механизма аналогичного event. Это просто флаг и список усыпленных потоков. Из других процессов вы не можете к ней обращаться.
А то что я привел - это именно межпроцессный мьютекс. Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд. ЕМНИП подобный функцонал приводится у Рихтера в качестве примера, класс Optex.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329615
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Anatoly MoskovskyУ секций нет механизма аналогичного event.Там хендл семафора есть.
В таком случае это еще одно подтвердение, что только безопасность мешает реализовать межпроцессный мьютекс в юзерспейсе.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329617
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд.
В той реализации что я привел соблюдаются все эти требования.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329913
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskysherzod_Ах вот вы о чем. О межпроцессной критической секции. Все таки не о виндовом объекте мьютекс с описанным в п3 поведением, потому что не совсем понятно какие будут распределния захвата и поведение, как будет учитываться приоритет задач и тд.
В той реализации что я привел соблюдаются все эти требования.

А как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329931
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует?
Так сам спинлок и обеспечивает это.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329943
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковА как ты решаешь вопрос обращения к spinlock размещенного в shared memory ну, скажем, если у тебя несколько процессоров? Кто тебе атомарность манипуляции с ним гарантирует?
Так сам спинлок и обеспечивает это.

Это утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329953
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным?
Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах.
http://ru.wikipedia.org/wiki/Spinlock
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329987
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковЭто утверждение было бы верным, если бы не разделяемая память, которую поддерживает операционная система. Кто тебе гарантирует, что чтение и запись требуемые спинлоку для проверки и установки состояния busy в многопроцессорном окружении будет атомарным?
Это гарантирует устройство спинлока, которое специально разработано на основе атомарных операций и рассчитано на работу в многопроцессорных системах.
http://ru.wikipedia.org/wiki/Spinlock

Хорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как?
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329993
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как?
Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен?
Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?".
Для работы спинлока нет разницы разделяемая это память, или нет.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329996
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковХорошо, есть два процесса p1 и p2, спин должен работать с неким адресом общим для двух процессов, не переходя в режим ядра. Как?
Я не понял. Вы ставите под сомнение возможность спинлока выполнять то, для чего он предназначен?
Ну по ссылке же написано как он работает. Там даже приведена реализация для x86. Это ответ на вопрос "как?".
Для работы спинлока нет разницы разделяемая это память, или нет.

Нет, не ставлю. Просто я пытаюсь понять. Есть два процесса, каждый со своим адресным пространством. Спин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38329997
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковспин должен работать с неким адресом общим для двух процессов
Кстати виртуальный адрес размещения спинлока необязательно совпадает в разных процессах, а физический - да, общий. Но физические адреса никого не интересуют.
Есть примитив "разделяемая память" - он реализует соответствующее размещение спинлока, без заботы о физ. адресах.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38330009
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет.
Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38330016
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyАнатолий ШироковСпин работает с адресом, который ему задается при инициализации. В рамках одного процесса все понятно. В рамках двух процессов (каждый в своем адресном пространстве) уже нет.
Вы выделяете блок разделяемой памяти (например через отображение файла в память) в ней создается спинлок, второй процесс получив доступ к этому блоку памяти получает адрес спинлока уже в своем адр. пространстве. Дальше никакой разницы по сравнению с потоками.

Вот это и вызываем у меня большие сомнения. Для использования разделяемой памяти для помещения туда спинлока необходимо знать детали его реализации. Если взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов.
...
Рейтинг: 0 / 0
взаимодействие между потоками, сигнал из одного потока в другой
    #38330019
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЕсли взять реализацию для x86 то, то как вы описали, работать не будет, поскольку адрес на котором должны блокироваться процессы может и не совпасть у двух разных процессов.
Вирт. адрес и не должен совпадать. А совпадение физ. адресов обеспечивается использованием разделяемой памяти.
...
Рейтинг: 0 / 0
73 сообщений из 73, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / взаимодействие между потоками, сигнал из одного потока в другой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]