Symbian中的线程、进程及同步

    技术2022-05-11  49

    全局内存块:跨越多个进程直接访问的内存块。 创建自己的全局内存块可以通过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)