У меня есть две нити, работающие как производитель, потребитель. В продюсерский нити у меня есть следующий код:Может ли поток прерываться планировщиком непосредственно перед его возвратом?
{
mediaQueue->PushEvent(boost::bind(/* params are not important */));
return 0;
}
mediaQueue является очередью сообщений и на PushEvent() называют поток уведомляются, что есть работа, подлежащая обработке. Потребительский поток просто выполняет функтор, созданный с помощью bind.
Для меня очень важно, чтобы поток производителя возвращался до того, как потребительский поток выполняет функтор.
Таким образом, вопрос: Возможно ли, чтобы продюсер был прерван сразу после его нажатия на событие, но до его возвращения?
Мое исследование до сих пор заставляет меня думать, что это возможно, и я должен реализовать блокировку, но как вы относитесь к этому?
Да, это странное требование. Использование синхронного объекта для принудительного возврата производителя до того, как потребитель попадет в основную часть своего кода, несомненно, будет работать, как вы говорите, но, скорее всего, приведет к почти бесполезному изменению контекста, поскольку потребитель просыпается на очереди, а затем снова блокируется явным синхронным ожиданием :(Тем не менее, лучше всего (только?) решение для необоснованного запроса, так что +1. –
@MartinJames: для этого есть правило. Если текущий (сломанный) код без синхронизации, похоже, работает, то потоки в настоящее время выполняются в «правильном» порядке случайно. Таким образом, синхронизация будет дешевой, потому что синхронизирующий объект будет выпущен до того, как его нужно будет приобрести в другом потоке. UB, когда изменения таймингов, для шанса двойного контекстного переключателя при изменении таймингов, очень много :-) –
@Steve Jessop да, это точно моя точка. Код работает именно так, но я уверен, что это вызовет проблемы, как только оно начнет работать :) –