Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1022231
  • 博文数量: 326
  • 博客积分: 10135
  • 博客等级: 上将
  • 技术积分: 2490
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-22 23:53
文章分类

全部博文(326)

文章存档

2014年(1)

2012年(4)

2011年(1)

2010年(4)

2009年(41)

2008年(44)

2007年(63)

2006年(168)

我的朋友

分类: C/C++

2007-02-09 11:59:51

全局内存块:跨越多个进程直接访问的内存块。
创建自己的全局内存块可以通过Rchunk API类
Rchunk chk;
_LIT(KChunkName,"My Globla Chunk");
TInt rc=chk.CreateGlobal(KChunkName,0x1000,0x5000);
其中CreateGlobal()方法第一个参数指定全局内存块的名称。后面两个参数为块指定分配给它的物理RAM和为块保留的虚拟内存的数量。
再其他进程中要访问全局内存块可以这样操作。
Rchunk chk;
_LIT(KChunkName,"My Globla Chunk");
TInt rc=chk.OpenGlobal(KChunkName,0);
TInt *ptr=(TInt *)chk.Base();
可以通过*ptr直接读写这块内存。
RChunk::OpenGlobal()第一个参数指定了全局内存块的名称,第二个参数用于说明块是为只读(1)还是可写的(0)
可以通过RChunk::Ajust(Tint newsize)方法来扩大块的提交内存尺寸。
TInt rc=chk.CreateGlobal(KChunkName,0x1000,0x5000);
例如上面创建了一个块,RAM提交给它0x1000字节,块的最大尺寸是0x5000
在这种情况下,只有用于读写的0x1000字节的物理RAM分配给了块。但是随后可以扩充该块,例如:
chk.Ajust(0x3000)
现在块被分配了0x3000字节的内存。


信号量:
全局信号量:
创建全局信号量
RSemphore::CreateGlobal(const TDesc &aname,TInt aCount,TOwnerType aType=EOwnerProcess);
第一个参数是信号量的名称,第二个参数是信号量的标记计数。
第三个参数指定句柄的所有权。
EOwnerProcess标记该信号量句柄可以在进程的任何位置进行访问。
EOwnerThread表示它只能被创建的线程访问。
打开全局信号量
RSemphore::OpenGlobal(const TDesc &aname,TOwnerType aType=EOwnerProcess);或者
RSemphore::Open(const TFindSemphore& aFind,TOwnerType aType=EOwnerProcess);
第一个函数通过信号量全名打开它。
第二个函数使用TFindSemphore类,通过包含通配符字符的部分名称打开它。
例如_LIT(KMatchName,"MySemphore*");
TFindSemphore semName(KMatchName);
RSemphore::Open(semName)
打开一个全局的信号量。
RSemphore::Signal()给信号量的标记数加1
RSemphore::Wait()给信号量的标记数减1
如果Wait()发现减后的标记数为负值,则Wait()阻塞,直到调用Signal()增加标记计数才返回。

(1)使用信号量可以做为一个直接信号,控制不同进程之间执行的流程。
(2)信号量也可以用来保护共享资源。
本地信号量:
创建本地信号量
TInt CreateLocal(Tint aTokenCount,TOwnerType aType=
EOwnerProcess);
本地信号量没有名字,不需要打开,通过创建它的RSemphore,就可以简单地访问它。
注意,如果把aType指定为EOwnerThread,但又想在另外一个线程中使用信号量,那么,就必须使用Duplicate()方法,为该线程创建句柄的副本。可以查看SDK文档中的RHandleBase::Duplicate()
阅读(1199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~