静态链接英特尔 tbb 的问题

Problems with statically linking Intel tbb

我最近读了这个问题How to statically link to TBB?,但我仍然不太理解将 tbb 用作静态链接库的问题(如果你这样做,他们的 makefile 是可能的 make extra_inc=big_iron.inc tbb

答案似乎是说问题是在一个程序中可以有多个单例,所有(大多数?)单例的实现都不允许这种情况发生。我不明白这背后的原因。

问题是当您 fork() 另一个进程时,单例在两个单独的进程中变成两个单独的单例吗? "program" 就是这个意思吗?另外,如果是这样,为什么他们不能 mmap() 共享内存并将其用作通信媒介?

另外,动态链接不只是意味着库本身在内存中共享,即代码段吗?

谢谢!

不,单例解释指的是单个进程,而不是多进程情况(尽管它在超额订阅和负载平衡方面有一些相同的问题)。

动态链接器确保库只存在一个全局数据部分,并在实现单例时调用全局构造函数。

使用静态链接的 TBB 库,最终可能会出现同时在同一进程中工作的多个 TBB 线程池实例,这些实例来自应用程序的不同组件。如果在调度程序的一个实例中分配和注册的内存或某些对象以某种方式在调度程序的另一个实例中使用,则会导致过度订阅或更糟的问题。这特别容易实现,因为 TBB 调度程序大量使用线程本地存储。调度程序的每个实例都将使用单独的 TLS 打破嵌套并行性规则直至死锁并导致内存泄漏和段错误,因为在一个调度程序中分配的任务可能最终会返回到另一个调度程序。因此,对于甚至不打算在模块边界之间传递对象的开发人员来说,这种情况可能并不明显。

有时,即使使用动态链接也会发生这种情况,例如TBB 共享库已重命名为其中一个应用程序组件。 TBB 团队正在努力解决这个问题。