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

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

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

Ответ 1

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

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

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