动态库中不推荐使用static变量

 关于static变量的生命周期。一般来说:static声明的变量初始化,只是在程序运行的第一次被执行。不过有例外,那就是如果该变量定义在dll 内,那么该变量的初始化工作是在dll被装载时执行,在这种情况下,程序虽然只运行一次,但是该静态变量可能会被初始化好几次(与dll被装载的次数有 关). 这个问题本质上是:static声明的变量的生命周期与包含它的组件相关。从这个意义上,我们可以说,static变量在不同的包含组件(EXE或 DLL)上表现出不同行为,移植能力差,容易造成BUG,这样的BUG也不容易发现。我们在开发程序的时候,不可能去假设该静态变量是被包含在什么样的组 件里。我想,这也是一个不鼓励使用static变量的一个重要原因。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
精易Python支持库Python2.7测试版 (1.1#1205版) 本支持库提供了 6 种库定义数据类型,提供了 87 种命令。 支持库说明 该支持库为易语言 调用并执行Python 代码、文件提供了支持。使用本支持库,可以实现单行Python 代码调用,函数交叉调用,Python 文件调用,模块引用等功能。极大的方便了易语言-Python 混合开发。可以使易语言能够使用Python 代码、类库等,丰富了开发过程和体验。本支持库命令封装更贴近于易语言的编程习惯,尽可能的简化了命令调用方式,降低了使用门槛和提高了编程效率。是您在进行易语言-Python 混合开发编程的必备库。 !使用注意本支持库为Python2.7.x提供支持。由于官方已经停止Python27的支持,该库可能会存在Bug,如果使用遇到了BUG请及时反馈。> 推荐使用Python3.x版本:https://bbs.125.la/thread-14653809-1-1.html 使用场景 1、Python源码文件是基于文本的文件,可以动态解析并且执行。配合云端可以实现软件的热更新。 2、可以使用Python众多功能强大的类库,让之前易语言无法完成的功能使用Python实现。 3、待补充 功能增加(相对于原作者版本) 1、增加了创建Python数据Py  命令。该命令的作用为:将易语言的数据类型转换为Python的类型,使Python可以直接使用,该方法的通常在Python回调函数的的返回值,或者参数值使用。2、增加了取参数数据Py  命令。该命令的作用为:在Python调用易语言的回调函数,获取到Python传递过来的值。3、增加了取当前执行帧局部变量Py  命令和取当前执行帧全局变量Py  命令,能够在执行时取得当前执行帧变量字典,进而得到变量信息。4、完善并修正命令备注说明的错误。 安装与使用 下载后,将支持库 - 放入易语言安装目录 目录的两个文件夹直接覆盖到易语言安装目录即可。 目录文件说明 支持库 - 放入易语言安装目录 lib         易语言动态库 static_lib         易语言静态库 调用例程  目录存放的是本支持库的使用例程 DLLs  这放入在Python使用的,库。这个目录对应python安装目录DLLs py         这作为python的库目录,放入了测试文件dom和其他需要调用到的库 python38.dll         基础执行的dll,必要 python38.zip         官方类库的打包,通过 Python官方下载页面的 Windows xxxx embeddable zip file 进行下载,下载后即可得到该文件 test_static.exe         静态编译后的文件 后续将推出使用的视频教程。大家可以先根据例题自行摸索本库的使用。 如果在使用的过程有任何问题或者有更好的建议,可以加入我们的QQ群:点击加入【精易】Python学习交流群 原作者:hmy100 原贴地址 本支持库基于原作者的支持库升级改造而来,在原有的基础上提供了更完善的功能,并且丰富了文档信息,修复了若干bug。 今后将由我们继续更新该支持库。
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .
本DEMO参考了https://download.csdn.net/download/abill425/10554049?tdsourcetag=s_pctim_aiomsg 资料; 非常感谢,如有侵权,请与本人联系; 与参考的资料相比,不同的是:参考资料是百度人脸SDK离线版本V1.0版本的; 而本DEMO是百度人脸SDK离线版本V1.1版本的; 本demo是x64的,封装成可供c#调用的dll是BaiduFaceDll.dll 使用步骤: 1.到百度AI开放平台 https://ai.baidu.com ,下载百度人脸离线SDK,(注意版本V1.1.0,修改日期:2018.08.31) 2.下载后,把sdk包那个443 MB的face-resource目录,复制到本demo的BaiduFaceDll\x64目录下(就是BaiduFaceDll.dll所在目录的上级目录) 3.打开BaiduFaceDll\x64\\Release\LicenseTool.exe,输入试用序列号(在百度AI开放平台取得,有效期30天),完成激活。注意,激活时需要联网。或者将已有的license.ini和license.key文件拷贝至此目录,注意注册序列号是与硬件相关的; 4.将本demo的BaiduFaceDll\x64\Release路径,加到系统的path变量。 5.运行本demo的BaiduFaceDll\x64\Release目录下的WindowsFormsApplication1.exe,可以测试封装的dll,输入两张图片;然后单击:图像对比,会显示对比结果; 在C#的函数注册: //请将"BaiduFaceDll.dll"修改为实际路径,如@"d:\BaiduFaceDll\x64\Release\BaiduFaceDll.dll", 或者直接把该实际路径加到系统的path变量。 [DllImport("BaiduFaceDll.dll")] public static extern void Init();//初始化 [DllImport("BaiduFaceDll.dll")] public static extern void UnInit();//销毁 [DllImport("BaiduFaceDll.dll")] public extern static int Track(string imgstr, ref StringBuilder res);//人脸检测,imgstr为图片的base64编码字符串 [DllImport("BaiduFaceDll.dll")] public static extern int User_Add(string user_id, string imgstr);//添加用户,imgstr为图片的base64编码字符串 [DllImport("BaiduFaceDll.dll")] public static extern int User_Delete(string user_id);//删除用户 [DllImport("BaiduFaceDll.dll")] public extern static void Identify(string imgstr, ref StringBuilder res);//人脸识别,imgstr为图片的base64编码字符串 [DllImport("BaiduFaceDll.dll")] public extern static void Match(string image1, int img_type1, string image2, int img_type2, ref StringBuilder res);//人脸1:1对比编码字符串 sdk调用流程: 初始化 -> 图片对比 -> 销毁 具体详细的windows-sdk使用说明,参见 http://ai.baidu.com/docs#/Face-Offline-SDK-Windows/top 源码: 本demo的BaiduFaceDll\BaiduFaceDll目录,是本封装dll的c++源码。VS版本为2015,Framework版本为4.0。 本DEMO只是封装了几个示例,其余封装,参考样式自行编写;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值