2009-12-01 31 views
9

我在多个地方阅读了Boost.Signals不是线程安全的,但我还没有找到更多关于它的细节。这个简单的引用并没有说太多。现在大多数应用程序都有线程 - 即使它们尝试使用单线程,它们的一些库也可能使用线程(例如libsdl)。Boost:Boost.Signals中的线程安全究竟是什么?

我想实现没有其他线程没有访问插槽的问题。所以在这个意义上,它至少是线程安全的。

但究竟什么工作,什么不会工作?只要我没有同时访问它,它是否可以在多线程中使用它?即如果我在插槽周围建立自己的互斥锁?

或者我只是在我创建它的那个线程中强制使用槽?或者我第一次使用它的地方?

+0

这已经有一段时间了......我的回答是否合理?基本上,信号库*本身*不会崩溃,无论你从任何线程所做的调用,只要它们是“有效的”......但是你要对自己的代码中的语义负责。 – HostileFork 2010-03-11 00:47:31

+0

这是有道理的,但它并不真正回答我所有的问题。 :)基本上你说过“在源代码中查找”。我会稍后再做,然后在这里发布所有我的问题的确切答案。 – Albert 2010-03-11 11:20:05

+0

你确实问过“究竟有效,哪些不起作用?”我觉得这比解析狭义的具体问题更重要。(这些答案是“是的:如果你用一个互斥体来防守是好的,但是如果你的插槽的语义是一次多于一个的线程可以运行它们,这可能是不必要的;就像从多个线程调用任何其他函数一样”和“不:你不限于只在创建它们的线程中使用插槽”) – HostileFork 2010-03-11 17:09:51

回答

5

我不认为这是太清楚或者,和图书馆评审said here之一:

我也并不喜欢这一事实,只有三次“线”字而得名。 Boost.signals2希望成为'线程安全信号'库。因此,更多 的细节和特别是关于该区域的更多示例应该给予用户 。

找出它的一种方法是go to the source并查看它们使用_mutex/lock()来保护它们。那么想象一下如果这些电话不在那里会发生什么。 :)

从我可以收集,它确保简单的事情,如“如果一个线程正在做连接或断开连接,这将不会导致通过附加到这些信号的插槽迭代不同的线程崩溃”。有点像使用线程安全版本的C运行时库确保如果两个线程同时对printf进行有效调用,那么不会发生崩溃。 (不是说你会得到将使任何意义输出—你仍然负责高阶语义。)

这似乎 并不像Qt的,其中螺纹某个信道的代码运行基于目标插槽的“线程亲和性”(这意味着发出信号可以触发许多不同线程上的插槽并行运行)。但我认为不支持这一点是为什么boost :: signal“combiners”可以do things like this

0

我看到的一个问题是,一个线程可以连接或断开连接,而另一个线程正在发送信号。

你可以很容易地包装你的信号,并与互斥呼叫连接。然而,包装连接并非微不足道。 (连接返回您可以用来断开连接的连接)。