- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我动态加载一个共享库时,例如在 linux 上使用 dlopen
,我是否需要担心加载库在处理器之间的可见性,或者它会被自动隔离/确保安全?
例如,假设我在加载的库中有这个函数:
char const * get_string()
{ return "literal"; }
在主程序中使用这样的字符串文字指针在多个线程之间是安全的,因为它们都保证看到它的初始值。但是,我想知道“初始值”的规则如何真正适用于加载的库(因为标准对它的处理不多。
说我加载库,然后立即调用get_string
函数。我通过非内存序列原子(用 C++11 的说法放宽)将指针传递给另一个线程。另一个线程是否可以安全地使用此指针而无需发出任何加载栅栏或其他同步指令?
我的假设是它是安全的。也许是因为新库将被加载到新页面中,另一个核心还不能加载它们,因此不能对它们有旧的可见性?
如果可能的话,我想要某种权威引用作为答案的一部分。或默认情况下如何使其成为线程安全的技术描述。如果它本身不是线程安全的,当然也可以反驳。
最佳答案
您的问题是:dlopen()
会在返回之前正确加载我所有的库代码吗?是的,它会。 否则只有一个线程会出现问题。如果您必须在 dlopen 异步完成之前休眠,这将非常难以处理。它还将执行各种检查并初始化所需的内容,在您有机会获得您正在寻找的函数指针之前。这意味着如果你得到那个指针,一切都在这里,你可以直接在任何线程中使用。
现在当然,您需要以通常的线程安全方式传递该指针,但我假设您知道该怎么做。
请注意,静态初始化和模块不能很好地协同工作(请参阅关于该主题的所有其他问题)。
您对核心的评论很奇怪。核心不加载内存。他们将其预取到缓存中,但这不是问题,只是有点慢。
关于linux - 共享库 (dlopen) 和库静态指针的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534666/
我是一名优秀的程序员,十分优秀!