首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在32位环境下调用___tls_get_addr是不是很危险?

在32位环境下调用___tls_get_addr是非常危险的。

___tls_get_addr是一个函数,用于获取线程本地存储(Thread Local Storage, TLS)的地址。在32位环境下,由于寄存器数量有限,TLS的访问限制在只能使用一个特殊的寄存器来存储TLS的地址。而32位环境中函数调用时使用的栈空间是共享的,多个函数可能会同时使用同一个TLS寄存器,造成寄存器中的TLS地址被覆盖。这样就可能导致TLS数据的混乱和错误。

因此,在32位环境下调用___tls_get_addr是不安全的,可能导致程序崩溃或产生意外结果。为了避免这种情况,建议在32位环境下使用其他可靠的方法来访问TLS,如使用操作系统提供的TLS接口。

请注意,以上回答仅针对问题中描述的具体情境,对于更广泛的云计算领域的专业知识,建议进行更加全面和深入的学习和研究。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OpenCV 图像拼接 优化

前面一篇文件 https://blog.csdn.net/zhanggqianglovec/article/details/103344658 讲述了如果将多个影像拼接为一个大的影像,本文将讲述 一些上面工具在使用过程中的问题及其优化 1. 问题出现: 首先直接说一下工具上的缺陷: 1.1 该工具依赖的是 x86库,包括opencv 2.4.3 ,cholmod 1.6.0 都是32位的,32和64都会影响工具在处理影像时的性能,比如在处理索尼相机的照片时,分辨率是 6000*4000,20多张照片,在处理到一半时会爆出 申请内存失败的情况。(本地环境为 i5处理器四核,16G内存),处理索尼相机时每张照片都会申请 6000*4000 字节内存块,直接内存爆出内存申请失败。 1.2 该工具迁移到其他机子上会出现不兼容的问题,应为opencv 底层设计到 GPU,CPU等指令,所以在其他机子上 运行,稍微大一点的图片 都会爆出 内存申请失败的问题。 2. 问题定位: 接下来说一下问题的定位 刚开始一直以为是内存的问题,因为在处理小一点的图片时,是没有问题的。在处理所以相机时才会出现;但是当迁移到其他机子上的时候,当地环境是 200G的内存,任然会报出 内存问题,这个就不是内存问题了。然后网上查询,大部分的解决思路 都是 32与64的不兼容。知其然不知其所以然,最后通过仔细的查看爆出来的原因,才豁然大悟,opencv底层调用到了cpu、gpu的指令,然后opencv对底层32/64的支持并不是很好,也就是说 在64环境下调用32 的指令,会出现不兼容的问题,从而导致频繁的爆出内存问题,到此为止,已经定位的差不多了,爆出内存问题只是表象,底层是msvcp.dll/msvcr.dll的执行。 3. 解决之道: 既然问题已经定位到,那么解决之道又是什么,毫无疑问:从底层实现对64的支持,不依赖32位的相关东西。说白了就一句话:重新编译mosaic的所有依赖库,全部换为 64版本 应该就能解决问题。 4. OpenCV 2.4.9 64位的编译 4.1 OpenCV下载: Opencv库的编译相对来说简单,通过Cmake直接可编译,问题是Opencv的源码获取比较麻烦,通过github获取,在git下载过程中时常会出现git下载失败,原因是github连接到了外网,会有网路断开等情况,所以通过github上查找 opencv来下载 还是比较麻烦的,需要多试几次。好在opencv2.4.9 有可执行程序,直接安装 opencv2.4.9 即可安装 他的源码,这个比较好,一下子全部搞定。 4.2 OpenCV工程生成: 在选择 Visual Studio 编译版本的时候需要注意下,Opencv 有区分 X86,X64 和 IA及RAM的编译,这个需要根据自己的情况进行选择,64位环境下一定选择 X64,因为我用的时候 Visual Studio 2010,所以我选择的是 Visual Studio 2010 X64版本,然后点集 Configure,Generate,OpenProject 即可在 Visual Studio 2010中 打开 Opencv 的工程。 4.3 OpenCV 工程编译: OpenCV 工程打开后,找到 ALL_BUILD工程,选择Debug/Release版本,右键build,这个工程只会生成对应的lib库和dll库,并不会生成头文件。 INSTALL工程,该工程首先会执行ALL_BUILD工程,然后复制相关库(lib/dll)到install下的 lib目录和bin目录,复制指定头文件到 include目录,这个工程满足要求,右键 build ,工程执行完毕后会在install目录下生成include目录,bin目录和lib目录。 4.4 Opencv编译完成 5. Cholmod 3.1.0 64位的编译 5.1 Cholmod的获取 网上关于Cholmod的讲解很少,在网上找了很久,找到了SuiteSparse这个产品,SuiteSparse是一个产品套件,里面包含了很多图像相关的处理库,Cholmod只是其中的一部分,而且SuiteSparse目前代码都是针对Linux下的开发,没有针对Windows做 相关的操作,源码目录下不存在cmaketext.txt 文件,不能在windows下直接编译。难道要全部

01

Linux批量远程命令和上传下载工具

https://github.com/eyjian/mooon/releases/tag/mooon-tools mooon_ssh:批量远程命令工具,在多台机器上执行指定命令 mooon_upload:批量远程上传工具,上传单个或多个文件到单台或多台机器 mooon_download:批量远程下载工具,从指定机器下载一个或多个文件 mooon-tools-glibc2.17.tar.gz 64位版本,glibc为2.17,点击下载 mooon-tools-glibc2.4.tar.gz 32位版本,glibc2.4,常常可用于64位版本glibc2.17环境,点击下载。 建议复制到目录/usr/local/bin,或在/usr/local/bin目录下解压,以方便所有用户直接使用,而不用指定文件路径。 可以通过环境变量或参数方式指定连接远程机器的用户名、密码和IP地址或IP地址列表,但参数方式优先: 1) 环境变量H等同参数-h,用于指定远程机器的IP或IP列表,多个IP间以逗号分隔,但mooon_download只能指定一个IP 2) 环境变量U等同参数-u,用于指定连接远程机器的用户名 3) 环境变量P等同参数-p,用于指定远程机器的用户密码 4) 环境变量PORT等同参数-P,用于指定远程机器的端口号 环境变量方式和参数方式可以混合使用,即部分通过环境变量设置值,部分以参数方式指定值。 并建议,参数值尽可能使用单引号,以避免需要对值进行转义处理,除非值本身已包含了单引号。 如果使用双引号,则需要做转义,如批量kill掉java进程: mooon_ssh -c="kill \$(/usr/local/jdk/bin/jps|awk /DataNode/'{print \$1}')" 另外,低版本glibc不兼容高版本的glibc,因此glibc2.4的不能用于glibc2.17环境,64位版本也不能用于32位环境。 64位系统上查看glibc版本方法:/lib64/libc.so.6 32位系统上查看glibc版本方法:/lib/libc.so.6 参数无顺序要求,不带任何参数执行即可查看使用帮助,如: $ mooon_ssh  parameter[-c]'s value not set usage: -P[22/10,65535]: remote hosts port, e.g., -P=22. You can also set environment `PORT` instead of `-P`, e.g., export PORT=1998 -c[]: command to execute remotely, e.g., -c='grep ERROR /tmp/*.log' -h[]: remote hosts separated by comma, e.g., -h='192.168.1.10,192.168.1.11'. You can also set environment `H` instead of `-h`, e.g., export H=192.168.1.10,192.168.1.11 -p[]: remote host password, e.g., -p='password'. You can also set environment `P` instead of `-p`, e.g., export P=123456 -t[60/1,65535]: timeout seconds to remote host, e.g., -t=100 -u[]: remote host user name, e.g., -u=root. You can also set environment `U` instead of `-u`, e.g., export U=zhangsan 对于整数类型的参数,均设有默认值和取值范围,如“-P[22/10,65535]”表示默认值为,取值范围为10~65535。对于字符串类型参数,如果为空中括号“[]”,则表示无默认值,否则中括号“[]”中的内容为默认值,如“-u[root]”表示参数“-u”的默认值为root。 mooon_ssh使用示例: 1) 参数方式 mooon_ssh -u=root -p='mypassword' -h=192.168.31.2,192.168.31.3 -c='whoami' 2) 环境变量方式 export U=root export P='mypassword' export H=192.168.31.2,192.168.31.3 mooon_ssh -c='whoami'

02

boost编译汇总

rem 编译64位boost rem 一直以来都是在Win32环境下Build和使用boost,但现在基本上每天都在64位Win7下工作, rem 所以很有必要把这几天的经验总结下来。和32位环境不同, rem x64环境下编译得先从开始菜单启动Visual Studio的Visual Studio 2008 x64 Win64 Command Prompt进入命令提示符, rem 而不是随便打开任意一个命令行窗口就行。然后转到boost根文件夹,运行bootstrap.bat生成x64版的bjam.exe。然后运行命令: rem bjam --build-type=complete toolset=msvc-9.0 threading=multi link=shared address-model=64 rem 即可生成DLL版平台库,如果要编译静态库版就把shared改为static。 rem 只生成一个库的话加上例如–with-python得编译选项,避免生成东西太多、时间太长。 rem 要有address-model=64属性,如果没有这个属性的话,会默认生成32位的平台库,加入这个选项才能生成64位的DLL。 rem 如果要生成Boost.Python库,需要先下载安装x64版的Python安装包,我用的版本是3.2.3。 rem 在使用这个库编写Python扩展DLL时,默认是使用动态库版的Boost.Python,要使用静态版的必须 rem 在C++项目中定义BOOST_PYTHON_STATIC_LIB宏,这样就不用在使用或发布扩展时带着boost_python-vc90-mt-1_50.dll一起了, rem 当然扩展DLL的尺寸会大些,如果做实验没必要这样,编译又慢生成的文件也大。 rem vs工具链版本:vs2003 : msvc-7.1,vs2005 : msvc-8.0,vs2008 : msvc-9.0,vs2010 : msvc-10.0

04
领券