2009-09-11 18 views
1

我正在编写一个网络库,用户可以将函数指针传递给某些网络事件执行。为了防止监听循环阻止开发人员的应用程序,我将事件处理程序传递给线程。不幸的是,这对于以线程安全的方式处理事物而言造成了一些麻烦。例如,如果开发人员传递了调用其Windows :: Forms应用程序元素的函数,则会引发InvalidOperationException。C++中的线程安全函数指针

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

+0

开发人员不应该负责确保他们在事件线程中不更改其组件吗? – 2009-09-11 14:43:22

+0

这个问题中的“线程安全性”是什么意思 - 您是否想要一种方法让回调函数修改其他线程中的Forms元素? “如何编写多线程代码?”国际海事组织是不是真的具体足以回答。 – 2009-09-11 14:44:30

回答

2

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

你想实现的是你的代码运行在一个特定的线程(也许是UI线程)。 为此,您必须使用某种类型的队列将调用同步到MainThread中。

这正是表单上.Net的BeginInvoke()/ Invoke()所做的。在这种情况下(在.NET框架内部的某个地方)队列就是windows消息队列。

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

+0

我不确定我们是否不同意。 “你的代码总是在函数指针用来调用它的线程中运行。”我不知道这是什么意思。如果你打算说:“你的代码总是在函数指针调用的线程中运行。”那么它是正确的。否则,它听起来像你的意思是说,指针引用的函数在被调用时不会有唯一的上下文,这是不正确的。 – 2009-09-11 18:27:52

+0

我编辑了答案,现在有希望清楚。 – mmmmmmmm 2009-09-11 19:56:08