在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题

在 Windows 下用 TDM-GCC(MinGW)开发 DLL 如果要用到数据同步锁,理论上可以采用 Windows API 提供的临界区实现(需要用到的函数有 InitializeCriticalSection、DeleteCriticalSection、EnterCriticalSection、LeaveCriticalSection),也可以采用 GCC 的 pthread 库中的 pthread mutex lock 互斥锁来实现(需要用到的函数有 pthread_mutex_init、pthread_mutex_destroy、pthread_mutex_lock、pthread_mutex_unlock)。但是在实际开发过程中发现,用 Windows API 的临界区实现数据同步,会导致 DLL 运行失败,目前原因还不明。无奈之下,改用 pthread 互斥锁实现数据同步。pthread 本身是跨平台的,编译链接时,使用 -lpthread 参数,预绑定到 pthread 的动态库,测试发现 DLL 运行良好。后来用 objdump 分析生成的 DLL,发现使用 pthread 互斥锁时,DLL 并没有真正引用 pthread 的库以及有关函数,所以猜测可能 pthread 针对 Windows 平台是采用 Windows API 提供的其他机制实现了互斥锁效果吧。

另外发现一点,TDM-GCC(MinGW)开发 DLL 时,仍然可以使用 GCC 特有的动态库(共享库)初始化、终止化函数机制,比如下面这样:

1 void __attribute__((constructor)) dynamic_library_init() {
2     pthread_mutex_init(&_ptm_mutex, NULL);
3     printf("dll _init() called OK\n");
4 }
5
6 void __attribute__((destructor)) dynamic_library_fini() {
7     pthread_mutex_destroy(&_ptm_mutex);
8     printf("dll _fini() called OK\n");
9 }

上面的 dynamic_library_init() 和 dynamic_library_fini() 是我自定义的函数名,你可以改为其他名字。因为默认的 _init() 和 _fini() 这两个初始化、终止化函数已经 GCC 占用,我们无法使用,所以必须通过 GCC 扩展机制定义自己的动态库、共享库初始化终止化函数。这样就可以避免在 Windows 下使用 DLLMain 机制,实现源代码级跨平台支持,将需要在 DLL 载入初始化或卸载终止化时执行的重要操作放在这两个函数里面。

时间: 2024-08-04 05:06:01

在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题的相关文章

在Windows下用Eclipse+CDT+MinGW搭建C++开发平台

本文提供了在Windows下用Eclipse+CDT+MinGW搭建C / C++开发平台的方法, 测试平台为Windows XP Sp2 CHS. 以下软件均为Windows平台下的版本. 1.安装JDK,目的是为了Eclipse的运行.目前版本是jdk-1_5_0_06-windows-i586-p.exe ,下载地址http://java.sun.com/javase/downloads/index.jsp.仅安装JDK即可.假设安装路径为D:\java\JDK.配置系统环境变量(右键点击

windows下搭建Apache+Mysql+PHP开发环境

原文:windows下搭建Apache+Mysql+PHP开发环境 要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Apache2.2;MySQL Server 5.5php-5.3 下载地址 环境下载 官方下载地址 Apache MySql PHP 至于我使用的版本已经上传到百度云提供大家下载了,这里就不多啰嗦了!! Apache Apache的安装和普通的应用程序安装没什么太大的区别,关键是配置.打开安装路径下的"conf\httpd.conf"文

windows下配置Sublime Text 2开发Nodejs

1 下载 Sublime Text 2 http://www.sublimetext.com/ 2 下载Nodejs插件,下载ZIP包 https://github.com/tanepiper/SublimeText-Nodejs 3 解压ZIP,重命名为Nodejs 4 将Nodejs复制到C:\Users\Administrator\AppData\Roaming\Sublime Text 2\Packages目录下 5 重启Sublime Text 2 ->Tools-->Build S

【转】在Windows下搭建React Native Android开发环境

http://my.oschina.net/jackzlz/blog/508210 安装JDK 从Java官网下载JDK并安装.请注意选择x86还是x64版本. 推荐将JDK的bin目录加入系统PATH环境变量. 安装Android SDK 可以单独安装Android SDK,也可以通过Eclipse ADT或者Android Studio一并安装.推荐使用Android Studio,以下说明会默认以Android Studio的方式说明.请注意选择x86还是x64版本. 为了加速下载,推荐从

windows下Qt5.2 for android开发环境搭建

windows下Qt5.2 forAndroid开发环境配置 1.下载安装Qt 5.2.0 for Android (Windows 32-bit)   http://qt-project.org/downloads 2.打开Qt Creator,打开帮助,输入android,找到官方说明,按照教程一步步的操作. 3.首先需要下载以下四个软件: 1)The Android SDK Tools  下载安装 2)The Android NDK  下载并解压,注意不能有空格   3)Apache An

在Windows下搭建Cocos2d-X的Android开发环境

在前面的博客中介绍了搭建Windows下的Cocos2d-X开发环境和搭建Windows下的Android开发环境,今天介绍搭建Cocos2d-X下的Android开发环境 在搭建Cocos2d-X下的Android开发环境前,首先要搭建好Windows下的Cocos2d-X开发环境和Windows下的Android开发环境 如果没有搭建好这两个环境可以看本人的博客 搭建Windows下的Cocos2d-X开发环境:http://blog.csdn.net/u010105970/article/

windows下用ADT进行AndroidNDK开发的详细教程(从环境搭建 配置到编译全过程)

这几天在学习android NDK的开发,那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Kit),即本地开发工具,简单地说,就是在开发android应用程序的时候,在java类中调用native函数,而native函数的接口也是在java类中定义的,但是native函数最终由本地的C/C++代码实现.简单地说,就是在java中调用C/C++函数.至于为什么要用NDK,我总结了一下,大致有以下几方面原因: 1.提升程序运行效率:众所周知

qemu-ga windows下的安装及监控开发

windows安装qemu-ga 虚拟机配置里添加virtio serial端口 #virsh edit instance-name devices里添加下面这段配置, 1 <channel type='unix'> 2 <source mode='bind' path='/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-name.sock'/> 3 <target type='virtio' name='org.qe

Windows和Linux使用WinSCP脚本(备份)自动数据同步

使用WinSCP脚本(备份)自动数据同步 写在前面:本笔记适用于windows和linux之间数据备份.使用以下脚本前提是windows已将安装了WinSCP程序 脚本文件script.txtoption echo offoption transfer binaryopen sftp://username:[email protected]:port::cd /backup/::put E:\app (简单上传文件命令)synchronize remote E:\app\back /backup