proj.4 线程安全
proj.4 线程安全
本文翻译自proj.4开发者文档
原文链接 http://proj4.org/development/threads.html
线程安全关键问题#
全局变量pj_error
是在线程之间共享的,使得它基本上不可能安全的处理错误(译注:这个和C的errno不一样)。通过引进执行上下文projCtx
来解决这个问题。
原点平移使用的网格文件,需要使用到全局共享的网格信息载入列表。proj 4.7.0版本中引入mutex(互斥锁)
来保护这些存储结构(参见pj_mutex.c),在4.7.0及后续版本中对此访问是线程安全的。
projCtx#
为了避免将pr_errno
作为全局变量,4.8.0版本中将thread context(线程上下文)
结构引入到PROJ.4 API
中。pj_init()
和pj_init_plus()
函数现在具有需要线程上下文变量的版本pj_init_ctx()
和pj_init_plus_ctx()
,采用投影上下文(projections context)。
可以使用pj_ctx_alloc()
创建投影上下文(projections context),当应用程序不提供投影上下文的时候,会使用全局默认上下文。有一系列pj_ctx_...
的函数用于创建
、操作
、查询
和销毁
上下文。上下文现在还可用来处理设置调试模式,并保持用于文本错误和调试消息的错误报告功能。API如下所示:
projPJ pj_init_ctx( projCtx, int, char ** ); projPJ pj_init_plus_ctx( projCtx, const char * ); projCtx pj_get_default_ctx(void); projCtx pj_get_ctx( projPJ ); void pj_set_ctx( projPJ, projCtx ); projCtx pj_ctx_alloc(void); void pj_ctx_free( projCtx ); int pj_ctx_get_errno( projCtx ); void pj_ctx_set_errno( projCtx, int ); void pj_ctx_set_debug( projCtx, int ); void pj_ctx_set_logger( projCtx, void (*)(void *, int, const char *) ); void pj_ctx_set_app_data( projCtx, void * ); void *pj_ctx_get_app_data( projCtx );
在多线程程序中应当使用pj_ctx_alloc()
为每个线程创建projCtx
。如果需要,上下文错误处理程序也许可以修改应用数据,但至少每个上下文都有一个内部错误值,使用pj_ctx_get_errno()
访问,而不是查看pj_errno
。
注意,pj_errno
依然存在,并且它由pj_ctx_set_errno()
设置(以及设置上下文特定的错误数),但pj_errno
仍然受到线程之间的全局共享问题的困扰,不应该被多线程应用程序使用。
注意 pj_init_ctx()
和pj_init_plus_ctx
会将projCtx
分配给创建的projPJ
对象。像是pj_transform()
,pj_fwd()
和pj_inv()
等函数会对使用上下文的projPJ
进行错误报告(会将错误信息报告到上下文)。
src/multistresstest.c#
已经编写了一个小的多线程测试程序(src/multistresstest.c
)用于测试PROJ.4的多线程使用。它执行一系列重投影来设置预期结果表,然后在多个线程中执行它们多次来确认结果是否一致。这个程序不会在构建proj4的时候构建,在类linux上可以使用如下命令构建:
gcc -g multistresstest.c .libs/libproj.so -lpthread -o multistresstest ./multistresstest
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2015-12-29 Valgrind 3.11.0编译安装