如何使用RMutex
来源:互联网 发布:淘宝童鞋店铺介绍 编辑:程序博客网 时间:2024/06/11 20:47
http://wiki.forum.nokia.com/index.php/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8RMutex
如何使用RMutex
From Forum Nokia Wiki
CS000969
- 开发伙伴平台:
S60 3rd Edition, MR
- 详细描述
使用RMutex可以确保你的线程不会再同一时间试图改变同一个值。RMutex.Wait()提供一个锁机制,用RMutex.Signal()才能打开。
Contents
[hide]- 1 MMP文件
- 2 头文件
- 3 源文件
- 4 注意事项
MMP文件
需要下列能力和链接库
CAPABILITY NONE
LIBRARY euser.lib
头文件
在线程间共享iShareValue变量
class CShared : CBase
{
public:
static CShared* NewL();
virtual ~CShared();
private:
CShared();
public:
RMutex iMutex;
// Shared data
TInt iSharedValue;
};
源文件
生成一个线程,并将CShared数据指针传入:
// Create shared data
iSharedData = CShared::NewL();
// Create threads
iMyThread = CMyThread::NewL(*this);
iMyThread->SetShared(iSharedData);
iMyThread2 = CMyThread::NewL(*this);
iMyThread2->SetShared(iSharedData);
线程调用RMutex::Wait()开始睡眠等待
TInt CMyThread::ThreadFunction(TAny* aParams)
{
// Add cleanup stack support.
CTrapCleanup* cleanupStack = CTrapCleanup::New();
// Get pointer to thread host
CMyThread* host = (CMyThread*)aParams;
TRAPD(err,
// Add support for active objects
CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
CleanupStack::PushL(activeScheduler);
CActiveScheduler::Install(activeScheduler);
// Create and start CPeriodic class that is executed in this thread
CPeriodic* periodic = CPeriodic::NewL(CActive::EPriorityLow);
CleanupStack::PushL(periodic);
periodic->Start(host->Interval(),host->Interval(),
TCallBack(host->PeriodicTick, host));
// NOTE: When adding CActiveScheduler support for threads we have to
// add at least one active object in it or it fails on
// CActiveScheduler::Start().
// CPeriodic is derived from CActive active object so that is good for
// this example.
// --> Thread execution starts
CActiveScheduler::Start();
// --> Thread execution ends (waiting for CActiveScheduler::Stop())
CleanupStack::PopAndDestroy(periodic);
CleanupStack::PopAndDestroy(activeScheduler);
);
host->ThreadExecuted(err);
delete cleanupStack;
return KErrNone;
}
在睡眠后调用PeriodicTick()改变共享数据对象的值,并用RMutex::Signal()释放
TInt CMyThread::PeriodicTick(TAny* aObject)
{
CMyThread* mythread = (CMyThread*)aObject;
if (mythread)
{
// ---> Acquire the lock
mythread->Shared()->iMutex.Wait();
// Change shared data value
mythread->Shared()->iSharedValue++;
// ---> Release the lock
mythread->Shared()->iMutex.Signal();
// Thread is executed once so time to stop it
CActiveScheduler::Stop();
// After this execution continues from CActiveScheduler::Start()
}
// Does not continue again
// Note: Does not work with this CPeriodic class
return EFalse;
}
完成CShared数据
CShared* CShared::NewL()
{
CShared* self = new (ELeave) CShared();
return self;
}
CShared::CShared()
{
iMutex.CreateLocal();
}
CShared::~CShared()
{
iMutex.Close();
}
注意事项
线程依次去改变共享对象的值,如果调用RMutex::Wait()后另一个线程就要等待,在RMutex::Signal()之后才继续。
- 如何使用RMutex
- 如何使用RMutex
- RMutex symbian 线程间变量锁定
- Android 如何使用使用数据库
- 如何安装使用Oracle10g
- 如何使用csdn blog
- 如何使用Log4j?
- 如何使用NetMeeting
- 如何使用 URLScan
- 如何使用线程
- 如何使用make
- 如何使用万用表
- 如何使用SQL*Loader?
- 如何使用 Quota
- 如何使用 gcc 编译程序
- 如何使用全局变量
- 如何使用 WinRoute 工具
- 如何使用Collection?
- Keil C51编译错误总结
- acm 杭电 ignatius and the princess iii 1028
- 常用小技巧
- 转_(*(volatile unsigned char *)0x5F
- 使用CParaFormat和TCharFormat对文本进行格式化
- 如何使用RMutex
- VI命令集锦
- 新年快乐
- C++ 模版忌讳
- 梦中
- 面试心得摘要
- MinGW 和 MSYS
- 20世纪最耀眼的12组科技成果
- Destination NAT with netfilter (DNAT)