2012-08-11 24 views
12

我有一个关于线程和回调的一般性问题。 说例如我们有一个线程连同主程序一起运行。关于回调函数和线程的一般查询

主程序已经注册了线程的回调函数。所以线程可以随时调用回调函数。 通常,我们通过传递函数指针给线程来注册一个回调。我想知道线程何时调用该回调函数,它是否是该线程的一部分,或者它是否将成为主程序的一部分。我想知道这个过程的机制,例如当线程调用回调时主程序执行是如何停止或中断的。另一件事是当调用回调时函数调用栈的行为如何。

+0

您使用哪种多线程方法? – klm123 2012-08-11 11:06:06

回答

10

作为一般规则,函数调用总是在调用者的上下文(线程)中进行。被调用者是一个函数,成员函数,函子对象还是其他任何东西都没关系。

换句话说,当线程调用你的回调函数时,调用就发生在线程中。主线程不会停止以执行回调。事实上,它不以任何方式参与执行回调。

各种框架提供了一些技巧,使得看起来好像一个线程可以直接调用另一个线程,但这总是通过某种编组消息传递机制以合作的方式完成。线程通常不会缠绕对方的堆栈。

+1

因此,例如我在我的主程序中有2个功能。 1)FunctionA() - >这是回调函数2)FunctionB() - >这是正常的函数。这两个函数都可以访问全局变量。所以在这种情况下,该变量是必需的互斥量。导致回调可能随时发生。 – 2012-08-11 11:21:42

+2

@ user1592046:是的。任何并发访问(至少其中之一是写入)必须受到某种同步机制的保护。如果一个线程希望等待另一个线程更改变量,则还需要使用信号机制,例如信号量或条件变量。 – 2012-08-11 11:23:56

+0

感谢您的澄清:-) – 2012-08-11 11:44:28