在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题
2015-12-05 17:39
453 查看
在 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 特有的动态库(共享库)初始化、终止化函数机制,比如下面这样:
上面的 dynamic_library_init() 和 dynamic_library_fini() 是我自定义的函数名,你可以改为其他名字。因为默认的 _init() 和 _fini() 这两个初始化、终止化函数已经 GCC 占用,我们无法使用,所以必须通过 GCC 扩展机制定义自己的动态库、共享库初始化终止化函数。这样就可以避免在 Windows 下使用 DLLMain 机制,实现源代码级跨平台支持,将需要在 DLL 载入初始化或卸载终止化时执行的重要操作放在这两个函数里面。
另外发现一点,TDM-GCC(MinGW)开发 DLL 时,仍然可以使用 GCC 特有的动态库(共享库)初始化、终止化函数机制,比如下面这样:
void __attribute__((constructor)) dynamic_library_init() { pthread_mutex_init(&_ptm_mutex, NULL); printf("dll _init() called OK\n"); } void __attribute__((destructor)) dynamic_library_fini() { pthread_mutex_destroy(&_ptm_mutex); printf("dll _fini() called OK\n"); }
上面的 dynamic_library_init() 和 dynamic_library_fini() 是我自定义的函数名,你可以改为其他名字。因为默认的 _init() 和 _fini() 这两个初始化、终止化函数已经 GCC 占用,我们无法使用,所以必须通过 GCC 扩展机制定义自己的动态库、共享库初始化终止化函数。这样就可以避免在 Windows 下使用 DLLMain 机制,实现源代码级跨平台支持,将需要在 DLL 载入初始化或卸载终止化时执行的重要操作放在这两个函数里面。
相关文章推荐
- UVA 11235 Frequent values
- LeetCode - 1. Two Sum
- 深入解析Java的Spring框架中bean的依赖注入
- STM32F103一些细节
- ie7中attr修改onclick事件失效
- http_build_query()详细相关
- solr整合mongo实现搜索
- Link - Bootstrap Tabs
- 杭电 4548 美素数
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
- openstack nova 基础知识——Quota(配额管理)
- Android开发之如何保证Service不被杀掉(broadcast+system/app)
- 使用sqlnet.ora限制IP访问
- Java 并发编程中的 CyclicBarrier 用于一组线程互相等待
- css指针样式
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- JavaScript动态加载CSS和JS文件
- Html5基础笔记
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
- Ugly Number II