我最近阅读了这个问题How to statically link to TBB?,我仍然不太清楚使用tbb作为静态链接库的问题(如果你make extra_inc=big_iron.inc tbb
,可以使用它们的makefile)< / p>
答案似乎是说问题在于单个程序中可能有多个单例,单身人士的所有(大多数?)实现都不会发生这种情况。我不明白这背后的原因。
问题是当你fork()
另一个进程时,单例变成两个独立进程中的两个单独的单例吗?这是他们的意思&#34;程序&#34;?如果就是这样的话,为什么他们不能mmap()
共享内存并将其用作通信媒介?
也不动态链接只意味着库本身在内存中共享,即代码段?
谢谢!
答案 0 :(得分:7)
不,单例解释是指单个进程,而不是多进程情况(但是,它在超额配置和负载平衡方面存在一些相同的问题)。
动态链接器确保库中只存在一个全局数据部分,并在实现单例时完全调用全局构造函数。
使用静态链接的TBB库,最终可以同时在同一进程中处理多个TBB线程池实例,这些实例来自应用程序的不同组件。如果以某种方式在调度程序的另一个实例中使用在调度程序的一个实例中分配和注册的内存或某个对象,则会导致过度订阅或甚至更糟的问题。由于TBB调度程序大量使用的线程本地存储,这一点特别容易实现。调度程序的每个实例都将使用嵌套并行性的单独TLS破坏规则直至死锁并启用内存泄漏和段错误,因为在一个调度程序中分配的任务可能最终返回到另一个调度程序。因此,对于甚至不打算在模块边界之间传递对象的开发人员来说,这种情况可能并不明显。
有时,即使使用动态链接,也会出现这种情况。 TBB共享库已重命名为其中一个应用程序组件。 TBB团队正在努力解决这个问题。