Symbian中的线程、进程及同步

 全局内存块:跨越多个进程直接访问的内存块。
创建自己的全局内存块可以通过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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值