×
Namespaces

Variants
Actions

多线程vs活动对象

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
翻译:
hoolee
最后由 hamishwillee 在 06 Aug 2012 编辑
  • 详细描述

Symbian OS是一个有着大量异步操作的系统。实际上所有的系统服务都可以通过server来完成,它们的操作放在自己的进程中以确保更稳定。

Service Provider API一般既为客户端程序提供了同步版本也提供了异步版本。但为了防止锁死应用程序的用户界面,你将需要经常使用异步版本。大部分时间消耗被用在异步服务的请求上,如文件系统。当请求在后台被处理后,服务请求函数会立刻完成。这意味着程序在请求完成后需要接收通知的处理。与此同时它也需要能够处理其他任务如相应用户输入或更新显示。

一般说来,多任务优先级抢占系统更多使用多线程:使用单独的线程执行异步任务,发送请求并等待完成。尽管在Symbian OS中可以完成,但也是缺乏效率和不建议使用的。

请参考Active Objects以便完整理解Active Object实质

Contents

Active Object和线程的不同

Active Object和一个线程共同完成多任务,当处理一个事件通知时,活动对象不能被调用自己的active scheduler预先置空,但线程可以被kernel这样处理。


因此线程共享的数据需要被mutex或semaphore保护,而活动对象则没有这个问题。

何时使用线程

只有少数情况下我们需要使用线程,当我们无法将一个任务拆解成分散为小块时。只能在单独的线程中完成,它可以完全异步执行不需要应用程序回应用户界面事件。

活动对象对比线程的优点

  1. 他们运行在同一线程中,比多线程之间的context switch消耗要小
  2. 没有数据同步的问题
  3. 在Symbian OS中,基于事件处理的多任务active object是比较理想的因为它们正是为了效率而设计的
  4. 因为每个线程都有自己的栈分配,因此增加了内存开销
  5. 线程间的context switch要比active scheduler循环中的活动对象间切换要低


简单的线程示例

// Name of the new thread
 
_LIT(KThreadName, "MyFirstThread");
 
// Creates a thread belonging to the current process
// and opens this handle to that thread.
 
TInt res = iThread.Create( KThreadName, ThreadEntryPoint, KDefaultStackSize,
NULL, &iVariable);
 
// Makes the thread eligible for execution. After a thread is created,
// it is put into a suspended state; the thread is not eligible to
// run until Resume() is called.
 
iThread.Resume();
 
// Control passes to this function when the thread is first resumed,
// i.e. when the thread is initially scheduled to run
// It just changes the value of the variable.
 
TInt CThreadExampleAppUi::ThreadEntryPoint(TAny* param)
{
 
TInt* para = static_cast<TInt *>(param);
*para = 1;
return 1;
 
}

ThreadEntryPoint必须为一个静态函数,否则会发生编译错误。

Symbian OS为单线程程序做了优化,建议使用活动对象替代多线程。作为一个经验法则,你应该多在symbian OS中使用单线程程序,除非你确实知道自己有必要使用多线程。

This page was last modified on 6 August 2012, at 07:02.
127 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×