Я разрабатываю приложение DirectShow. Я столкнулся с проблемой взаимоблокировки, которая, кажется, вызвана блокировкой получения в функции обратного вызова, вызываемой из потока. Это квест, который я задал на форуме MSDN:
http://social.msdn.microsoft.com/Forums/en-US/windowsdirectshowdevelopment/thread/f9430f17-6274-45fc-abd1-11ef14ef4c6a
Теперь я должен избегать получения блокировки в этом потоке. Но проблема в том, что я должен вывести звук в другой поток, как я могу поместить данные в другой поток без блокировки?
Кто-то сказал мне, что я могу использовать PostMessage из win32 sdk для публикации данных в другой ветке. Но, однако, чтобы получить сообщение, я должен запустить программу Windows. Моя программа представляет собой модуль расширения Python C ++. Это может быть очень трудно добавить цикл для извлечения сообщения. Так что я думаю, что другой способ передачи данных между потоками без блокировки.
(На самом деле ... поток производителя не может быть заблокирован, но потребительский поток может это сделать.)
Блокировать или не блокировать, вот в чем вопрос.
Так вот вопрос, как это сделать?
Спасибо.
------ EDIT ------
Мне кажется, я знаю, почему я зашел в тупик, это может не быть проблемой DirectShow.
Основной поток принадлежит Python, он вызывает stop, а именно, содержит GIL. И остановка ожидания обратного вызова DirectShow в потоке возврата. Но обратный звонок приобретает GIL.
Это выглядит так
Main (Hold GIL) -> Stop (ожидание обратного вызова) -> Callback (Wait GIL) -> GIL (удержание в основном потоке)
Черт возьми! Вот почему я так не люблю многопоточность.
Несмотря ни на что, спасибо за помощь.