proj.4 线程安全
2016-12-29 13:50
295 查看
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
相关文章推荐
- [转]GeoHash核心原理解析
- 为什么建议设置背景图像的同时还设置背景颜色?
- ios应用后台退出后,再进入会重新启动
- SSH框架之Hibernate的Criteria 查询、本地SQL查询、分页查询
- Oracle小函数大用处!
- ubuntu 安装配置FTP服务器
- IE8 、 IE7 的兼容性问题
- django部署到apache之后文件上传 [Errno 13] Permission denied
- MySql解压版安装&配置多数据库&主从分离
- awk入门及进阶
- js-超实用的源生封装cookie方法加批量删除cookie
- bluetooth5的主要特性更新
- CentOS 7.2 升级内核支持 Docker overlay 网络模式
- Ext.js的store里放model,还是field?
- 数据字典
- spark-submit 分发应用
- 欢迎使用CSDN-markdown编辑器
- TEC1303.Form个性化技术总结 - 第四部分 Custom.pll个性化开发实例
- Oracle 索引的分类
- spring和Hibernate整合