C++ C+中的线程安全函数指针+;

C++ C+中的线程安全函数指针+;,c++,multithreading,C++,Multithreading,我正在编写一个网络库,用户可以将函数指针传递给它,以便在某些网络事件上执行。为了防止侦听循环阻塞开发人员的应用程序,我将事件处理程序传递给线程。不幸的是,这给以线程安全的方式处理事情带来了一些麻烦。例如,如果开发人员传递调用其Windows::Forms应用程序元素的函数,则会引发InvalidOperationException 有没有处理线程安全的好策略?函数指针不能是线程安全的,因为它们声明了要调用的点。所以它们只是指针。 您的代码总是在调用它的线程中运行(通过函数指针) 您希望实现的是,

我正在编写一个网络库,用户可以将函数指针传递给它,以便在某些网络事件上执行。为了防止侦听循环阻塞开发人员的应用程序,我将事件处理程序传递给线程。不幸的是,这给以线程安全的方式处理事情带来了一些麻烦。例如,如果开发人员传递调用其Windows::Forms应用程序元素的函数,则会引发InvalidOperationException


有没有处理线程安全的好策略?

函数指针不能是线程安全的,因为它们声明了要调用的点。所以它们只是指针。 您的代码总是在调用它的线程中运行(通过函数指针)

您希望实现的是,您的代码在特定线程(可能是UI线程)中运行。 为此,必须使用某种队列将调用同步到主线程中

这正是.Net在表单上的BeginInvoke()/Invoke()所做的。在这种情况下(在.NET framework的深处),队列就是windows消息队列


但是,只要“正确”线程读取并执行来自该队列的调用请求,您就可以使用任何其他队列。

开发人员不应该负责确保他们在进入事件线程之前不会更改组件吗?您所说的“线程安全”是什么意思在问题中-您特别想要一种让回调函数修改来自另一个线程的表单元素的方法吗?“一个人是如何编写多线程代码的?”IMO的回答不够具体。我不确定我们是否不同意。“你的代码总是在函数指针用来调用它的线程中运行。”我不知道这意味着什么。如果你想说:“你的代码总是在线程中运行,函数指针用来调用它。”那么这是正确的。否则,听起来您的意思是指针引用的函数在被调用时没有唯一的上下文,这是不正确的。