dll共享数据段中是不是可以使用指针或者STL
dll共享数据段中是否可以使用指针或者STL
现在想使用共享数据段作为进程间数据共享的手段。但是好像共享数据段只能共享 定长 的数据,不知道能不能共享指针。
但是无法共享, 如果只是个 int g_iValue = 10;是没有问题的,网上是说共享数据必须先“初始化”, 不太理解这里的初始化,是一定要赋初值,还是说内存大小要固定呢?
想共享个 map<string strCodeID, TCodeInfo> 也不知道怎么初始化
求大家帮忙解答下,谢谢了!
------解决思路----------------------
------解决思路----------------------
共享数据不能开在堆和栈上,因为这些都是进程自己的。
如果很大的数据,使用 FileMapping 共享。
------解决思路----------------------
这么大数据用共享内存。CreateFileMapping
------解决思路----------------------
那你用数据库好了~
------解决思路----------------------
1楼说的应该是这个意思,不是在栈上分配内存。
初始化就是在定义的时候赋值。
之所以需要初始化,是因为如果不初始化,变量会跑到BSS段中,而不是你自己定义的DLLSharedSection段,从而共享失败。
DLL共享节中不能使用char* g_pBuf = new char[MAX_BUF_SIZE];这样的指针,因为指针本身虽然是共享的,但指针指向的内存空间是进程私有的。
STL容器可以用构造函数初始化,但即便如此也不能放在DLL共享节中共享,原因同上,一个map对象内部的数据实际上也是存在new出来的内存上的。当然,非要共享也不是不可,map容器还有第四个模板参数class Alloc,就是用来给程序员控制map容器内部的内存分配的,可以自行实现一个allocator,从共享的内存块上分配内存来给map用。
总而言之,进程间共享数据最好以基本的数据类型形式来共享,当然进程间共享内存还有很多好办法,比如4楼提到的CreateFileMapping
------解决思路----------------------
可以使用指针,但指针指向的内存也必须是在共享数据段中的内容。同理stl也可以,但就是很麻烦。
所以,还是直接共享足够长的数据段吧。
现在想使用共享数据段作为进程间数据共享的手段。但是好像共享数据段只能共享 定长 的数据,不知道能不能共享指针。
#pragma comment(linker, "/section:DLLSharedSection,rws")
#pragma data_seg("DLLSharedSection") // 声明共享数据段,并命名该数据段
#define MAX_BUF_SIZE 0x800000
char* g_pBuf = new char[MAX_BUF_SIZE];
#pragma data_seg()
但是无法共享, 如果只是个 int g_iValue = 10;是没有问题的,网上是说共享数据必须先“初始化”, 不太理解这里的初始化,是一定要赋初值,还是说内存大小要固定呢?
想共享个 map<string strCodeID, TCodeInfo> 也不知道怎么初始化
求大家帮忙解答下,谢谢了!
------解决思路----------------------
char g_pBuf[MAX_BUF_SIZE] = { };
------解决思路----------------------
共享数据不能开在堆和栈上,因为这些都是进程自己的。
如果很大的数据,使用 FileMapping 共享。
------解决思路----------------------
这么大数据用共享内存。CreateFileMapping
------解决思路----------------------
那你用数据库好了~
------解决思路----------------------
#pragma comment(linker, "/section:DLLSharedSection,rws")
#pragma data_seg("DLLSharedSection")
#define MAX_BUF_SIZE 0x800000
char g_pBuf[MAX_BUF_SIZE] = {0};
#pragma data_seg()
1楼说的应该是这个意思,不是在栈上分配内存。
初始化就是在定义的时候赋值。
之所以需要初始化,是因为如果不初始化,变量会跑到BSS段中,而不是你自己定义的DLLSharedSection段,从而共享失败。
DLL共享节中不能使用char* g_pBuf = new char[MAX_BUF_SIZE];这样的指针,因为指针本身虽然是共享的,但指针指向的内存空间是进程私有的。
STL容器可以用构造函数初始化,但即便如此也不能放在DLL共享节中共享,原因同上,一个map对象内部的数据实际上也是存在new出来的内存上的。当然,非要共享也不是不可,map容器还有第四个模板参数class Alloc,就是用来给程序员控制map容器内部的内存分配的,可以自行实现一个allocator,从共享的内存块上分配内存来给map用。
总而言之,进程间共享数据最好以基本的数据类型形式来共享,当然进程间共享内存还有很多好办法,比如4楼提到的CreateFileMapping
------解决思路----------------------
可以使用指针,但指针指向的内存也必须是在共享数据段中的内容。同理stl也可以,但就是很麻烦。
所以,还是直接共享足够长的数据段吧。