1.
Symbian作为一个os也提供了传统的进线程间通信, 可以参考RSemaphore, RMutex, RChunk(共享内存), 及3版提供的消息队列RMsgQueueBase等.
Note: C/S 模式本身就是基于RSemaphore的。所以调用client端调用SendRecieve()方式, client端会等待server端(RSemaphore.Wait()), server端接收后(RSemaphore.Signal())会通知client端,然后client端才会继续执行。
如果只是简单的一个信号, 那么使用RThread::RequestComplete可以给对方发送一个完成事件.
2.
Symbian下的
线程对象类有 RThread, DThread, NThread.
RThread是
用户层的,DThread是Kernel层的, NThread是nanokernel层的。
用户层的
代码要创建一个线程用RThread,内核和驱动里要创建线程用DThread, nano内核层创建一个线程用NThread。
一个RThread就有一个DThread,一个DThread就有一个NThread,反过来不成.
RThread就像对DThread的封装,句柄,提供给用户使用。
用户层要创建一个线程,RThread::Create会被调用,它会通过
系统接口调用DThread::Create,
DThread::Create又会代用DThread::DoCreate, DThread::DoCreate又会调用NKern::ThreadCreate 创建线程的nanokernel部分。
所以创建一个RTHread就会生成一个DThread,生成一个DThread就会生成一个NThread。
DThread类有一个成员NThread iNThread;
这个成员就是与它关联的NThread。
一个RThread就有一个DThread很容易理解,为什么一个DThread还要有一个NThread呢,
这主要是因为symbian内部最后真正调度的对象是NThread
3.
1) 多线程相比于活动对象,具有更高的运行期要求,例如,线程间上下文切换比同一个线程活动对象的切换慢一个数量级;线程需要更大的空间开销,通常线程要有4K内核空间和8K用户空间的程序栈;相比之下,活动对象只需要占用C++对象的空间(通常小于1K)。
2) 使用线程和使用活动对象实现多任务的最大区别是前者是由内核抢占执行,后者的协同多任务发生在一个线程中,并且一旦开始处理一个事件,活动对象就无法被其所在的活动调度器所抢占(所以RunL要迅速返回,否则会阻塞主线程,即事件处理尽量简短)。
但仍有很多场合必须使用多线程,如下
a.多媒体处理
b.移植程序
c.一个任务无法分割成简短片段的任务。
d.为了保证所执行任务的连续性,比如播放声音
这样就可以将其在新建的线程中实现,从而可以异步运行该线程,而不会影响到应用程序对用户接口事件的响应。
PS: symbian下访问界面(画图绘屏等)必须在主线程
3) 为了保护线程免受潜在恶意代码的困扰,从Symbian 8.0后就不允许一个线程操纵其他线程(这也是在主线程中执行receiveThread.kill(0)导致程序退出的原因)。
4) 可在.mmp文件中作为分离进程运行组件的主线程指定其堆尺寸的最小值和最大值
Epocheapsize minSize maxSize
5) 编写多线程代码时,不应该任意的赋予线程一个高优先级,否则它可能抢占系统中的其他线程。
6) 所有线程默认优先级为EPriorityNormal,当线程被创建,其被置为挂起状态不会开始运行,直到调用Resume()
7) 线程之间无法直接传递数据指针,因为进程地址空间被加以保护而相互隔离了。
8) 每个线程都有自己的heap和stack;主程序有默认的清除栈(cleanStack),新建的线程就得手动创捷清除栈。
9) 多线程可通过同步对象(RSemaphore, RMutex, RChunk
)来访问资源。通过限制或直接锁住资源,保证在同一时刻只能有一个线程对资源写操作,比如临界区(Critical Sections)4.
线程的优先级(均是相对所在进程的优先级而言)
- EPriorityNull(-30)
- EPriorityMuchLess(-20)
- EPriorityLess(-10)
- EPriorityNormal(0)
- EPriorityMore(+10)
- EPriorityMuchMore(+20)
- EPriorityRealTime(+30)
终止线程
- 可以使用RThread::Kill(TInt aReason)来终止线程
- RThread提供ExitType()和ExitReason()来返回线程终止的原因
- ExitType()返回值包括
·EExitKill: 线程函数返回或显示调用Kill()函数
·EExutPanic:线程因为严重错误而结束
·EExitPending:线程仍在运行
- ExitReason()返回值包括
·返回代码:线程函数正常返回
·终结代码:线程调用Kill()函数
·错误代码:线程因为严重错误而退出
·零:线程仍在运行
阅读(1515) | 评论(0) | 转发(0) |