×
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.
93 page views in the last 30 days.
×