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

proj.4 线程安全的更多相关文章

  1. Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

    本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...

  2. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  3. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  4. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  5. Java 线程

    线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...

  6. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  7. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  8. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  9. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

随机推荐

  1. [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  2. [LeetCode] One Edit Distance 一个编辑距离

    Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...

  3. knockout学习笔记目录

    关于knockout学习系列的文章已经写完,这里主要是做个总结,并且将目录罗列出来,方便查看.欢迎各位大神拍砖和讨论. 总结 kncokout是一个轻量级的UI类库,通过MVVM模式使前端的UI简单话 ...

  4. java sound初探

    网上关于java sound的正规资源讲解的非常好,本文不再给出示例,主要提供一些好的资源,并说说我的一些理解,用于形成对java sound的整体认识. 一.几个词汇 TTS:text-to-spe ...

  5. 记录rewrite url我之前不知道的地方

    大部分url重写的需求是伪静态,当然有很多第三方开源组件,但是这种需求的核心方法其实就是context.rewritePath() 要是系统像ARR那样,用重写做代理和反向代理,一般的重写就不行了,c ...

  6. 使用视 meta 标签来控制手机浏览器布局

    移动浏览器的Fennec一样呈现在一个虚拟的"窗口"页面(视),通常比屏幕宽.所以他们不需要去挤每个页面布局到一个小窗口(这会破坏许多非移动优化的网站) .用户可以平移和缩放才能看 ...

  7. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  8. Beta版本冲刺第一天

    Aruba 408 409 410 428 429 431 完成任务: 瀑布流方块长按删除提示 实现获取剪贴板内容并保存到数据库 常驻通知栏模块界面实现,设置按钮并预留intent 立会照片: 燃尽图 ...

  9. Scrum Meeting 20161209

    本周Sprint Master 史少帅 会议概要 工作总结: · 陈双, 王永超: 打分功能合并到主分支并且测试成功 · 鲍航波 录音上传.下载接口封装完成,可供调用 · 侯宇泰, 史少帅: 修复录音 ...

  10. Java开发环境搭建——Idea开发环境

    Idea版本选择由于公司使用JDK7,所以我选择安装Version 2016.1.4(手动安装试验出来的,最新版的2016.1.4启动时提示需要安装JDK8)下载 其实可以安装多个版本的JDK,然后指 ...