生活随笔
收集整理的這篇文章主要介紹了
Ice笔记--C++线程与并发(小结)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++線程與并發(Ice3.4.2)
概述
Ice服務器是多線程模型的。在涉及資源的訪問和操作的時候將要考慮同步訪問機制。
Ice線程庫提供了一些與線程有關的抽象:
互斥體,遞歸互斥體,讀寫遞歸互斥體,監控器,一個線程抽象,允許開發者創建,控制,銷毀線程。
?
1.互斥體(The Mutex Class)
1.1)互斥體的定義
IceUtil::Mutex類提供了簡單的非遞歸互斥機制,其定義如下:
[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)使用互斥類
假設有一個FileSystem類和write的函數如下:
[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();??}??
??????然而這種加入互斥機制的方法并不好,例如對互斥體加鎖了但在函數返回時并沒有實現解鎖操作,這種情況下就引發死鎖情況。
??????因此我們建議使用Ice提供的兩個助手類Lock和TryLock,如下:
[cpp] view plaincopy
voidSomeClass::someFunction()??{?????????IceUtil::Mutex::Locklock(_mutex);????????????????????if?(someCondition)?{??????????????return;????????????????}???????????}???
2.遞歸互斥體(The C++ RecMutex Class)
上面所介紹的互斥體是非遞歸性質的,也就是說他們不能被多次加鎖,即使是已經擁有該所的線程也不行。這樣會給一些情況帶來不便
[cpp] view plaincopy
IceUtil::Mutex_mutex;????void?f1()??{????????IceUtil::Mutex::Lock?lock(_mutex);??????????}????void?f2()??{??????IceUtil::Mutex::Locklock(_mutex);??????f1();????????????}??
?????????為了解決這個問題,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)
由于遞歸互斥體無論是在讀取還是寫操作的情況下,都是將其并發線程訪問序列化。但是讀取資源的線程并不會修改所訪問的內容;因此讓多個讀取線程并行擁有互斥體,而同一時刻只能有一個寫入的線程獲取互斥體。
下面是該讀寫互斥類的定義:
[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.定時鎖
讀寫鎖提供了一些可使用超時的成員函數。等待的時間量是通過IceUtil::Time類的實例指定的。
5.監控器(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類相對于互斥體來說,它提供的互斥機制更為靈活,因為他們允許線程檢查某一條件,如果條件為假,就讓自己休眠;而這線程會讓其他某個改變了條件狀態的線程喚醒。
?? 關于如何使用該Monitor類,可以參考上一篇文章--C++線程與并發(二)。
總結
以上是生活随笔為你收集整理的Ice笔记--C++线程与并发(小结)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。