首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在C++的纯头文件中怎么声明一个全局变量

2012-02-08 
在C++的纯头文件中如何声明一个全局变量------------filename:pure.h---------------------#ifndef__PURE_

在C++的纯头文件中如何声明一个全局变量
------------filename:   pure.h---------------------

#ifndef   __PURE_H
#define   __PURE_H
#include   "vector.h "
#include   <algorithm>

const   ROW_SIZE   =   1024;
const   CACHE_SIZE   =   8   *   1024;

struct   row_data
{
        int   tableid;
        int   time;
        char   data[ROW_SIZE];
};
bool   func_sort(const   row_data   &v1,   const   row_data   &v2)
{
        return   ((v1.tableid   >   v2.tableid)
                ||   ((v1.tableid   ==   v2.tableid)   &&   (v1.time   <   v2.time)));
};

static   vector <row_data>   write_factory((size_t)CACHE_SIZE);
static   vector <row_data>   receive_factory((size_t)CACHE_SIZE);
static   vector <row_data> ::iterator   write_iter;


#endif

我在两个线程里面同时修改write_factory里的值,相互没影响,跟踪地址才发现write_factory变量在两个线程里面的首地址根本就不样。
两个线程存在于两个文件中,两个文件的头文件又包含上述的pure.h


[解决办法]
非要在头文件中定义的话用静态的吧
被两个文件包含的时候不会出现链接问题
[解决办法]
不可以!
全局变量应该定义在cpp里,然后在.h进行声明。
[解决办法]
建议你用内存映射,可以让线程共享资源
[解决办法]
写一个Singleton类来访问这些全局变量吧。
[解决办法]
//这样就可以了:


//pure.h
#ifndef __PURE_H
#define __PURE_H

#include <vector>

const int ROW_SIZE = 1024;
const int CACHE_SIZE = 8 * 1024;

struct row_data
{
int tableid;
int time;
char data[ROW_SIZE];
};
inline bool func_sort(const row_data &v1, const row_data &v2)
{
return ((v1.tableid > v2.tableid)
|| ((v1.tableid == v2.tableid) && (v1.time < v2.time)));
};

extern std::vector <row_data> write_factory; //不指定大小, 声明
extern std::vector <row_data> receive_factory; //不指定大小
extern std::vector <row_data> ::iterator write_iter;

#endif

///
///pure.cpp
#include "pure.h "
..........
std::vector <row_data> write_factory((size_t)CACHE_SIZE); //指定大小, 定义
std::vector <row_data> receive_factory((size_t)CACHE_SIZE); //指定大小
std::vector <row_data> ::iterator write_iter;

.............

[解决办法]
在头文件里面 extern vector <row_data> write_factory
在随便一个CPP文件里面 vector <row_data> write_factory((size_t)CACHE_SIZE);


[解决办法]
在Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16位Windows那样做。Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。
这种数据共享是让两个或多个进程映射同一文件映射对象的视图,即它们在共享同一物理存储页。这样,当一个进程向内存映射文件的一个视图写入数据时,其他的进程立即在自己的视图中看到变化。但要注意,对文件映射对象要使用同一名字。
CACHE_SIZE = 8 * 1024看来你要共享的数据也不小,所以建议你使用内存映射.
你将此向量数据写入一个临时文件fTemp.
然后要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件fTemp。
在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。


为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。
在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。
捕获事件并接收数据事件触发, 从端口接收数据并保存到内存映射文件,此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样.
在完成了对内存映射文件的使用时,还要通过一系列的操作完成对其的清除和使用过资源的释放。这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。
在处理完成后还要再次通过内存映射文件的形式将文件恢复到实际大小:
创建另外一个文件内核对象
以实际数据长度创建另外一个文件映射内核对象
关闭文件内核对象
将文件数据映射到进程的地址空间
将数据从原来的内存映射文件复制到此内存映射文件
从进程的地址空间撤消文件数据映像
关闭文件映射对象
删除临时文件

热点排行