生活随笔
收集整理的這篇文章主要介紹了
Ice笔记--C++线程与并发(小结)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C++線程與并發(fā)(Ice3.4.2)
概述
Ice服務(wù)器是多線程模型的。在涉及資源的訪問(wèn)和操作的時(shí)候?qū)⒁紤]同步訪問(wèn)機(jī)制。
Ice線程庫(kù)提供了一些與線程有關(guān)的抽象:
互斥體,遞歸互斥體,讀寫遞歸互斥體,監(jiān)控器,一個(gè)線程抽象,允許開發(fā)者創(chuàng)建,控制,銷毀線程。
?
1.互斥體(The Mutex Class)
1.1)互斥體的定義
IceUtil::Mutex類提供了簡(jiǎn)單的非遞歸互斥機(jī)制,其定義如下:
[cpp] view plaincopy
namespaceIceUtil?{????enum?MutexProtocol?{?PrioInherit,?PrioNone?};????class?Mutex?{??public:????????????Mutex();????????????Mutex(MutexProtocol?p);??????????~Mutex();????????????void?lock()?const;?????????????bool?tryLock()?const;??????????void?unlock()?const;???????????????typedef?LockT<Mutex>?Lock;??????????typedef?TryLockT<Mutex>TryLock;????};??
?
1.2)使用互斥類
假設(shè)有一個(gè)FileSystem類和write的函數(shù)如下:
[cpp] view plaincopy
#include<IceUtil/Mutex.h>????namespaceFilesystem?{??????class?FileI?:?virtual?public?File,??????????????virtual?public?Filesystem::NodeI?{????public:??????????????????private:??????????????Lines?_lines;??????????????IceUtil::Mutex?_fileMutex;???????};??????}????void?Filesystem::FileI::write(const?Filesystem::Lines?&text,const?Ice::Current?&)??{????_fileMutex.lock();????_lines?=?text;??????_fileMutex.unlock();??}??
??????然而這種加入互斥機(jī)制的方法并不好,例如對(duì)互斥體加鎖了但在函數(shù)返回時(shí)并沒(méi)有實(shí)現(xiàn)解鎖操作,這種情況下就引發(fā)死鎖情況。
??????因此我們建議使用Ice提供的兩個(gè)助手類Lock和TryLock,如下:
[cpp] view plaincopy
voidSomeClass::someFunction()??{?????????IceUtil::Mutex::Locklock(_mutex);????????????????????if?(someCondition)?{??????????????return;????????????????}???????????}???
2.遞歸互斥體(The C++ RecMutex Class)
上面所介紹的互斥體是非遞歸性質(zhì)的,也就是說(shuō)他們不能被多次加鎖,即使是已經(jīng)擁有該所的線程也不行。這樣會(huì)給一些情況帶來(lái)不便
[cpp] view plaincopy
IceUtil::Mutex_mutex;????void?f1()??{????????IceUtil::Mutex::Lock?lock(_mutex);??????????}????void?f2()??{??????IceUtil::Mutex::Locklock(_mutex);??????f1();????????????}??
?????????為了解決這個(gè)問(wèn)題,Ice同樣也提供了遞歸互斥鎖,如下示例:
[cpp] view plaincopy
#include?<IceUtil/RecMutex.h>????IceUtil::RecMutex?_mutex;?????void?f1()??{??
[cpp] view plaincopy
???????IceUtil::RecMutex::Lock?lock(_mutex);???????????????}????void?f2()??{?????????IceUtil::RecMutex::Lock?lock(_mutex);?????????f1();????????????}??????
3. 讀寫遞歸互斥體(The RWRecMutex Class)
由于遞歸互斥體無(wú)論是在讀取還是寫操作的情況下,都是將其并發(fā)線程訪問(wèn)序列化。但是讀取資源的線程并不會(huì)修改所訪問(wèn)的內(nèi)容;因此讓多個(gè)讀取線程并行擁有互斥體,而同一時(shí)刻只能有一個(gè)寫入的線程獲取互斥體。
下面是該讀寫互斥類的定義:
[cpp] view plaincopy
namespaceIceUtil?{????????class?RWRecMutex?{????????public:?????????????????void?readLock()?const;?????????????????bool?tryReadLock()?const;?????????????????bool?timedReadLock(const?Time&)?const;???????????????????void?writeLock()?const;?????????????????bool?tryWriteLock()?const;?????????????????bool?timedWriteLock(const?Time&)?const;???????????????????void?unlock()?const;?????????????????void?upgrade()?const;?????????????????bool?timedUpgrade(const?Time&)?const;???????????????????typedef?RLockT<RWRecMutex>RLock;?????????????????typedefTryRLockT<RWRecMutex>?TryRLock;?????????????????typedef?WLockT<RWRecMutex>WLock;?????????????????typedefTryWLockT<RWRecMutex>?TryWLock;????????};??}??
4.定時(shí)鎖
讀寫鎖提供了一些可使用超時(shí)的成員函數(shù)。等待的時(shí)間量是通過(guò)IceUtil::Time類的實(shí)例指定的。
5.監(jiān)控器(The Monitor)
???? 5.1 Monitor類定義
?????? Monitor類在IceUtil::Monitor中定義,如下所示:
[cpp] view plaincopy
?????namespace?IceUtil?{???????????template?<class?T>???????????class?Monitor?{???????????public:?????????????????????void?lock()?const;?????????????????????void?unlock()?const;?????????????????????bool?tryLock()?const;???????????????????????void?wait()?const;?????????????????????bool?timedWait(constTime&)?const;?????????????????????????????????????????????????????????????????????????????????????????????????????????????????void?notify();?????????????????????void?notifyAll();???????????????????????typedefLockT<Monitor<T>?>?Lock;?????????????????????typedefTryLockT<Monitor<T>?>?TryLock;???????????};??}???????
??? Monitor類相對(duì)于互斥體來(lái)說(shuō),它提供的互斥機(jī)制更為靈活,因?yàn)樗麄冊(cè)试S線程檢查某一條件,如果條件為假,就讓自己休眠;而這線程會(huì)讓其他某個(gè)改變了條件狀態(tài)的線程喚醒。
?? 關(guān)于如何使用該Monitor類,可以參考上一篇文章--C++線程與并發(fā)(二)。
總結(jié)
以上是生活随笔為你收集整理的Ice笔记--C++线程与并发(小结)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。