fork - 如何安全地 fork() 多线程进程?
问题描述
我的程序依赖于第 3 方静态库。该库将启动一个由全局变量初始化触发的线程,该线程将锁定互斥体,我无法更改第 3 方的代码。在我的 main() 程序中,我将调用 fork() 并退出以使我的程序成为守护程序。
上述行为可能导致死锁,因为在 main() 之后未初始化全局变量时,无法在 fork 的子进程中解锁锁。
所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现这一点?
解决方案
所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现这一点?
“在加载静态库之前”不是问题,静态库是在构建时链接的,而不是在运行时动态加载的。
该库将启动一个由全局变量初始化触发的线程
您应该考虑使用设计更好的库,或者与维护者一起提出一个经过深思熟虑的初始化方案。main 之前的生活通常是个坏主意。在 main 之前生成线程是一个非常糟糕的主意。替代方案可能是,使用在调用库的 API 时触发的惰性静态,或者更好的是,引入显式 init 函数,或使用上下文指针,以便用户可以管理库状态。抱歉,这听起来像是轮胎起火了,在你花一些时间修理它之前,没有理智的方法来分叉它。
推荐阅读
- swift - Swift 组合块运算符
- python-3.x - 如何使用 Selenium 仅获取依赖内容(不包括引用内容)
- ruby - 通过 Puma 从 Sinatra 传递标头(或其他设置)
- python - 在 sqlachemy 中结合 like 和 filter_by 方法
- mapbox - 让 Mapbox 轮廓显示出来
- python - 在嵌套列表中查找字符串的最后一次出现?
- java - BigQuery Java API 将行转换为 Java 对象
- azure-devops - 在 Windows 机器上设置自托管代理:写错误:发生错误:未配置
- orm - CreateQueryBuilder 在数组中查找字符串?
- c# - C# 在解决方案上禁用闭包