Я разрабатываю приложение DirectShow. Я сталкиваюсь с проблемой взаимоблокировки, проблема возникает из-за блокировки покупки в функции обратного вызова, вызванной из потока. Это задание я спросил в MSDN форуме:Как вывести данные из потока в другой поток без блокировки?
Теперь я должен избегать, чтобы приобрести замок в этом потоке. Но проблема в том, что я должен выводить звук в другой поток, как я могу поместить данные в другой поток без блокировки?
Кто-то скажет мне, что я могу использовать PostMessage win32 sdk для отправки данных в другой поток. Но, однако, чтобы получить сообщение, я должен запустить программу Windows. Моя программа - это модуль расширения Python C++. Это может быть очень сложно добавить цикл для вывода сообщения. Поэтому я думаю еще один способ передачи данных между потоками без блокировки. (На самом деле ... производитель нить не может быть заблокирован, а поток-потребитель может сделать это.)
Чтобы заблокировать или не заблокировать, это вопрос.
Итак, вопрос в том, как это сделать?
Спасибо.
------ EDIT ------
Я думаю, что я знаю, почему у меня в тупик, что не может быть проблема DirectShow.
Основной поток принадлежит Python, он вызывает остановку, а именно, он удерживает GIL. И остановка ждет обратного вызова DirectShow в потоке. Но callback приобретает GIL.
Похоже, что этот
Main (Удержание GIL) -> Stop (Ждите обратный вызов) -> Обратный вызов (Wait GIL) -> GIL (удержание на основной поток)
Черт! Вот почему мне не нравится многопоточность. Независимо от того, спасибо, спасибо.
Вы работаете в Windows 95/98? Если нет, то какая у вас ОС? –
К сожалению, я знаю, почему он зашел в тупик. Основной поток goet GIL и остановка вызова, остановка ожидания обратного вызова и обратный вызов для GIL. –