您的位置:首页 > 其它

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