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