静态联系Intel TBB的问题

Problems with statically linking Intel tbb

本文关键字:问题 TBB Intel 联系 静态      更新时间:2023-10-16

我最近阅读了该问题如何静态链接到TBB?而且我仍然不太了解将TBB用作静态链接的库(如果您执行make extra_inc=big_iron.inc tbb,则可以使用其Makefile)

答案似乎说问题是单个程序中可能有多个单身人士,所有(大多数?)单身人士的实现都不会让这种情况发生。我不明白这背后的原因。

问题是,当您 fork()另一个过程时,单例将在两个单独的过程中变成两个单独的单例?这就是他们所说的"程序"?另外,如果那样的话,为什么他们不能mmap()共享内存并将其用作通信介质?

也不动态地链接仅表示库本身在内存中共享,即代码段?

谢谢!

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

动态链接器确保库只有一个全局数据部分,并在实施Singleton时精确地调用全局构造函数。

使用静态链接的TBB库,可以同时使用同一过程中的TBB线程池的多个实例,这些实例来自应用程序的不同组件。这会导致过度提取的问题,甚至在某种程度上分配和注册的一个在调度程序的一个实例中,甚至在调度程序的另一个实例中使用了一个内存或某些对象。由于TBB调度程序大量使用的线程 - 本地存储,这一点特别容易实现。调度程序的每个实例都将使用单独的TLS打破嵌套并行性规则,直到死锁并启用内存泄漏和SEGFAULTS,因为在一个调度程序中分配的任务最终可能会返回另一个调度程序。因此,对于甚至不打算在模块边界之间通过对象的开发人员而言,这种情况可能并不明显。

有时,即使在TBB共享库已重命名为应用程序组件之一。TBB团队正在努力解决此问题。