GDAL singleton的经典错误

本文详细解析了GDAL库中Singleton模式的实现方式,通过对比DCLP模式在不同版本间的变迁,强调了多线程环境下的安全考虑。通过分析代码片段,揭示了如何在实际应用中确保Singleton实例的唯一性与安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几年前写过一个帖子:Singleton之C++部分一

当时提到了在C++11标准出现之前,DCLP的singleton模式是不可靠的。因为pInstance = new Singleton这句话会被编译器编程三条指令,并乱序执行。从而导致锁保护失效。

最近由于工作的关系,开始使用GDAL库,并且开始看内部的源代码。发现其中也是使用了DCLP模式。在gdaldrivermanager.cpp文件中,代码如下:

/**
 * \brief Fetch the global GDAL driver manager.
 *
 * This function fetches the pointer to the singleton global driver manager.
 * If the driver manager doesn't exist it is automatically created.
 *
 * @return pointer to the global driver manager.  This should not be able
 * to fail.
 */

GDALDriverManager * GetGDALDriverManager()

{
    if( poDM == NULL )
    {
        CPLMutexHolderD( &hDMMutex );

        if( poDM == NULL )
            poDM = new GDALDriverManager();
    }

    CPLAssert( NULL != poDM );

    return const_cast<GDALDriverManager *>( poDM );
}

我的GDAL源码是1.8演化过来的。碰到这种情况,要么改变其实现,要么在一开始的时候确保用一个单线程调用,创建出第一个实例,才算安全。

可见,无论多么著名的软件,如果你自己看其中的代码,总有值得推敲的部分。你不断的看,不断的推敲,学习了,也就提高了。


### 解决Python环境下安装GDAL出现的错误 #### 复制GDAL相关文件至指定路径 对于某些情况下,在使用`pip`成功安装GDAL后,IDE如PyCharm仍可能报告错误。这可能是由于IDE未能正确识别已安装的包所致。一种解决方案是在对应的路径(即Python的安装位置\Lib\site-packages)下找到并复制所有与GDAL有关联的文件[^1]。 #### Linux环境下重新编译安装GDAL 当在Linux平台上尝试从源码构建GDAL Python绑定时,如果遇到配置过程中SWIG bindings状态显示为`no`的情况,则表明缺少必要的工具——SWIG。此时应当先完成SWIG的安装工作;随后建议运行命令`make distclean`来清理之前的编译残留物,再依照常规流程执行`./configure --with-python='/usr/bin/python3.7'`, `python setup.py build`以及`python setup.py install`等操作以确保顺利完成安装过程[^2]。 #### Windows平台上的环境变量设定 针对Windows操作系统而言,除了通过`pip`或Anaconda渠道获取预编译好的二进制版本外,还需要特别注意调整系统的环境变量设置。具体来说就是增加两条记录:一条指向GDAL数据目录(`set GDAL_DATA=C:\Program files\GDAL\gdal-data`),另一条则用于扩展系统路径(`set PATH=%PATH%;"C:\Program files\GDAL"`)[^3]。 #### 特定DLL加载失败问题处理 有用户反馈说即使按照官方指南完成了最新版GDAL组件的部署,在实际测试阶段还是会遭遇类似于“无法加载请求的动态链接库”的提示框弹出。经排查得知此类现象往往同缺失特定依赖项有关,比如案例中的`ogr_MSSQLSpatial.dll`就牵涉到了SQL Server客户端驱动程序的支持。对此类情况的一个常见修复手段便是额外安装备份所需的第三方软件包,像上述例子中提到的就是Microsoft SQL Server 2012 Native Client x64 SDK[^4]。 ```bash # 设置环境变量 (适用于Windows批处理脚本) set GDAL_DATA=C:\Program files\GDAL\gdal-data set PATH=%PATH%;%PROGRAMFILES%\GDAL\ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值