C++ Boost:Boost中什么是线程安全的?信号?

C++ Boost:Boost中什么是线程安全的?信号?,c++,boost,boost-signals,C++,Boost,Boost Signals,我在多个地方读到了Boost.Signals不是线程安全的,但我没有找到更多关于它的细节。这句简单的引语并没有说那么多。现在,大多数应用程序都有线程——即使它们尝试使用单线程,它们的一些库也可能使用线程(例如libsdl) 我猜这个实现不会遇到其他线程不访问插槽的问题。因此,从这个意义上讲,它至少是线程安全的 但究竟什么是有效的,什么是无效的?只要我不同时访问它,从多个线程使用它会有效吗?例如,如果我在插槽周围构建自己的互斥体 或者我被迫只在创建插槽的线程中使用插槽?或者我第一次使用它的地方?我

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

我猜这个实现不会遇到其他线程不访问插槽的问题。因此,从这个意义上讲,它至少是线程安全的

但究竟什么是有效的,什么是无效的?只要我不同时访问它,从多个线程使用它会有效吗?例如,如果我在插槽周围构建自己的互斥体


或者我被迫只在创建插槽的线程中使用插槽?或者我第一次使用它的地方?

我认为它也不太清楚,图书馆的一位评论员:

我也不喜欢只有三次“线程”这个词被命名的事实。 Boost.signals2希望成为一个“线程安全信号”库。因此还有一些 应提供有关该领域的细节,特别是更多的例子 用户

一种解决方法是查看他们使用_mutex/lock()来保护什么。然后想象一下,如果没有这些电话,会发生什么

据我所知,它确保了一些简单的事情,比如“如果一个线程正在进行连接或断开连接,那么不会导致另一个线程在连接到这些信号的插槽中进行迭代而崩溃”。有点像使用线程安全版本的C运行时库如何确保如果两个线程同时对
printf
进行有效调用,则不会发生崩溃。(更不用说您将获得的输出将有任何意义,因为您仍然需要负责更高阶的语义。)


它似乎不像Qt,在Qt中,某个插槽的代码运行的线程是基于目标插槽的“线程亲缘关系”(这意味着发出信号可以触发多个不同线程上的插槽并行运行)但我猜不支持这就是boost::signal“combiners”的原因can.

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


您可以轻松地包装您的信号,并使用互斥连接呼叫。然而,包装这些连接并非易事。(connect返回可用于断开连接的连接)。

已经有一段时间了……我的回答有意义吗?基本上,信号库本身不会崩溃,不管你从任何线程发出什么调用,只要它们是“有效的”……但你要对自己代码中的语义负责。是的,这很有意义,但它并没有真正回答我所有的问题。:)基本上你说的是“在源代码中查找”。我会在以后的某个时候这样做,然后在这里发布我问题的所有确切答案。你确实问过“什么确切有效,什么无效?”我觉得这比剖析你更狭隘的具体问题更重要。(这些答案是“是:如果您使用互斥锁进行防护,这很好,但如果插槽的语义使得一次可以运行多个线程,则可能没有必要;这就像从多个线程调用任何其他函数”和“否:您不必仅在创建插槽的线程中使用插槽。”)更重要的是,你在这里问的真正问题是“当库作者说他们的库是“线程安全的”时,这意味着什么”知道答案比Boost.Signals更普遍适用,希望观众了解一般概念可能是他们觉得没有必要在文档中详细解释的原因。另外:我并不是轻率地说“阅读来源”。我链接到一个精确的源文件和要查找的函数。因为在没有文档的情况下,这确实是知道问题答案的唯一方法,例如“如果我在发出信号时从插槽断开信号,并且在另一个线程上调用插槽,会发生什么情况……它会完成对插槽的调用还是会删除中间的插槽”。没有其他方法可以回答“到底什么有效,什么无效”。