gpt4 book ai didi

c++ - 静态链接英特尔 tbb 的问题

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:58 24 4
gpt4 key购买 nike

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

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

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

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

谢谢!

最佳答案

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

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

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

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

关于c++ - 静态链接英特尔 tbb 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42636374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com