×
Namespaces

Variants
Actions

标题:多线程中的内存分配问题

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

文章
huwell 在 27 Aug 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑
  • 设备, 软件 版本:

S60 1st Edition

S60 2nd Edition, FP1, FP2, FP2

S60 3rd Edition

S60 3rd Edition FP1


  • 详细描述

在共享一个堆栈空间的多线程程序中使用User::Alloc()以及User::Available()是无法做到线程安全的。


在一个多线程程序中,主线程可以为一个子线程指定堆栈空间。这里有两个方案:

分配堆栈和共享堆栈


如果两个或多个线程共同操作一个共享堆栈,则需要同步机制(如互斥等)。


  • 解决方案

1)共享堆栈:

  IMPORT_C TInt Create( const TDesC &aName,
 
TThreadFunction aFunction,
 
TInt aStackSize,
 
RAllocator *aHeap,
 
TAny *aPtr,
 
TOwnerType aType = EOwnerProcess );


如果上面的aHeap参数设置为NULL,新线程将会和主线程共享同一堆栈。


在下面这个情况中,内存分配将会在各个线程中同步处理:

RMutex sharedMutex;
 
...
 
 
 
sharedMutex.Wait();
 
array[i] = User::Alloc( bytesToAlloc );
 
sharedMutex.Signal();
 
sharedMutex.Wait();
 
TInt heapSize = User::Available( largestBlock );
 
sharedMutex.Signal();


2)分配堆栈 当使用下面这个RThread::Create()的重载版本时,新的线程将拥用它自己的堆栈空间。

  IMPORT_C TInt Create( const TDesC &aName,
 
TThreadFunction aFunction,
 
TInt aStackSize,
 
TInt aHeapMinSize,
 
TInt aHeapMaxSize,
 
TAny *aPtr,
 
TOwnerType aType = EOwnerProcess );


由于是不同的堆栈,内存的分配调用将无法在线程中同步处理。

This page was last modified on 15 December 2011, at 13:01.
89 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.

×