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

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

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


person Sanjay D Raju    schedule 11.08.2012    source источник
comment
Какой подход к многопоточности вы используете?   -  person klm123    schedule 11.08.2012


Ответы (1)


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

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

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

person Marcelo Cantos    schedule 11.08.2012
comment
Так, например, у меня есть 2 функции в моей основной программе. 1) FunctionA()-> это обратный вызов 2) FunctionB()-> это обычная функция. Обе эти функции могут обращаться к глобальной переменной. Итак, в этом контексте для этой переменной необходим мьютекс. Потому что обратный вызов может произойти в любое время. - person Sanjay D Raju; 11.08.2012
comment
@ user1592046: Да. Любые одновременные доступы (по крайней мере, один из которых является записью) должны быть защищены каким-либо механизмом синхронизации. Если один поток хочет дождаться, пока другой изменит переменную, вам также потребуется использовать механизм сигнализации, такой как семафор или условная переменная. - person Marcelo Cantos; 11.08.2012