boost自带的单例模式不能跨dll使用
2015-06-17 18:08
351 查看
1.问题描述
使用qt自带的model/view实现,在dll中对model进行赋值,在exe中使用model在view中显示,基于boost自带的singleton实现时出现了赋值后显示为空数据的错误
2.问题分析
通过查看boost的singleton源码分析,dll和exe中对应的static类对象应该不是同一个,故无法实现异步下的写和读操作
3.测试代码
dll中的mydll.h
#ifndef MYDLL_H #define MYDLL_H #include "mydll_global.h" #include <boost/thread/detail/singleton.hpp> class MYDLL_EXPORT A { public: A():m_na(0){} public: int Get() {return m_na;} void Set(int na) {m_na = na;} private: int m_na; }; typedef boost::detail::thread::singleton<A> usermodel; class MYDLL_EXPORT mydll { public: mydll(); ~mydll(); public: void func() {usermodel::instance().Set(10);} private: }; #endif // MYDLL_H
exe中的main.cpp
#include <QtCore/QCoreApplication> #include <QtCore/QStringList> #include <QtCore/QString> #include "../mydll/mydll.h" #ifdef _DEBUG #pragma comment(lib, "../Win32/Debug/mydll.lib") #else #pragma comment(lib, "../Win32/Release/mydll.lib") #endif //#include "mydefine.h" void func() { usermodel::instance().Set(10); } int main(int argc, char *argv[]) { QString strValue = "123"; QStringList list = strValue.split(":"); for (int nindex = 0; nindex < list.count(); ++nindex) { QString strMsg(list.at(nindex)); int nvalue = 0; } QCoreApplication a(argc, argv); //func(); mydll dlla; dlla.func(); int na = usermodel::instance().Get(); return a.exec(); }
备注:期望结果na=10 实际结果na=0
4.总结
在不同的地址空间如跨dll或dll和exe之间不要使用单例作为共享,可以采用类中的static变量进行数据共享
相关文章推荐
- 设计模式之创建型模式 - 特别的变量问题
- boost相关小知识(长期顶置更新)
- C#单例模式(Singleton Pattern)实例教程
- php设计模式之单例、多例设计模式的应用分析
- javascript 单例/单体模式(Singleton)
- C++单例模式应用实例
- Python单例模式实例分析
- Java单例模式实例简述
- C++单元测试:boost.test
- boost asio学习笔记 [1] - 同步通讯
- Ubuntu下如何安装boost?
- iOS设计模式之单例模式
- How to get a boost::shared_ptr from this
- boost 库 enable_shared_from_this 实现原理分析
- boost bind使用指南
- 单例模式
- 单例模式扩展
- 使用boost进行CRC64计算
- [网络开发]boost::asio简介
- Windows下如何编译使用boost?