Подтвердить что ты не робот

Общий запрос о функциях обратного вызова и потоках

У меня есть общий вопрос о потоках и обратных вызовах. Например, у нас есть поток, непрерывно работающий вместе с основной программой.

Основная программа зарегистрировала функцию обратного вызова с потоком. Таким образом, поток может вызвать функцию обратного вызова в любое время. Как правило, мы регистрируем обратный вызов, передавая указатель на поток. Я хочу знать, когда эта функция обратного вызова вызывается потоком, будет ли она частью этого потока или будет частью основной программы. Я хочу знать механизм этого процесса, например, как прекращение или прерывание основной программы, когда обратный вызов вызывается потоком. Другое дело, как будет работать стек вызовов функции при вызове обратного вызова.

4b9b3361

Ответ 1

Как правило, вызовы функций всегда выполняются в контексте вызывающего (thread). Не имеет значения, является ли вызываемая функция функцией, функцией-членом, объектом-функтором или чем-то еще.

Другими словами, когда поток вызывает ваш обратный вызов, вызов происходит в потоке. Основной поток не останавливается, чтобы выполнить обратный вызов. Фактически, это никак не связано с выполнением обратного вызова.

Различные фреймворки предоставляют трюки, чтобы заставить его выглядеть так, как если бы один поток мог вызвать другого напрямую, но это всегда делается совместным путем через какой-то механизм маршрутизации сообщений. Нитки, как правило, не обманывают друг друга.