Ice中Monitor的使用
IceUtil::Monitor類
timedWait:時間到達後,嘗試獲取鎖,但可能其他執行緒正在使用,當鎖被釋放時,才會真正得到,開始後續的執行。
- namespace IceUtil {
- template <class T>
- class Monitor {
- public:
- void lock() const;
- void unlock() const;
- bool tryLock() const;
- void wait() const;
- bool timedWait(const Time&) const;
- void notify();
- void notifyAll();
- typedef LockT<Monitor<T> > Lock;
- typedef TryLockT<Monitor<T> > TryLock;
- };
- }
1. 從程式碼可以看出,Monitor比Mutex(互斥體)多了wait/timedWait,notify/notifyAll操作。這樣允許一個獲得鎖進入臨界區的執行緒,能夠自我掛起,讓出臨界區。
2.Monitor是個模板類,需要Mutex/RecMutex(遞迴互斥體)做為模板引數。
3.wait/timedWait在等待期間,會掛起執行緒,讓出互斥體,等待被喚醒。
區別是:
timedWait(const Time&)會在時間到達後,自我喚醒,重新嘗試獲得鎖;
wait()是等待被喚醒(其他執行緒呼叫notify()或者notifyAll()。
timedWait返回值:如果有另外的執行緒呼叫 notify 或 notifyAll,在發生超時之前喚醒掛起的執行緒,這個呼叫返回 true,監控器重被鎖住,掛起的執行緒恢復執行。而如果發生超時,函式返回 false。
使用例項
- template<class T> class Queue
- : public IceUtil::Monitor<IceUtil::Mutex> {
- public:
- void put(const T & item) {
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- _q.push_back(item);
- notify();
- }
- T get() {
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- while (_q.size() == 0)
- wait();
- T item = _q.front();
- _q.pop_front();
- return item;
- }
- private:
- list<T> _q;
- };
timedWait:時間到達後,嘗試獲取鎖,但可能其他執行緒正在使用,當鎖被釋放時,才會真正得到,開始後續的執行。
- .....
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- if ( queue_.empty() || queue_.size() < buffer_size_ ) {
- IceUtil::Time time = IceUtil::Time::seconds( 10 );//等待10s
- timedWait(time);
- }
- ...
補:
Mutex為簡單互斥體:一個執行緒獲得鎖後,不能再嘗試獲得鎖。
RecMutex為遞迴互斥體,一個執行緒可以多次嘗試獲得鎖。
- 頂
相關文章
- sql monitor的使用(一)SQL
- 反叛之冰:ZeroC ICE基礎使用
- TypeScript In ICETypeScript
- 飛冰 - ICE Design Pro 使用指南
- PHP中介軟體ICE,ICE的安裝配置,ICE常見編譯和執行(異常)錯誤PHP編譯
- 【翻譯】.NET 6 中的 dotnet monitor
- WebSphere Business Monitor V6.2 中的新增功能Web
- SQL Monitor Report 使用詳解SQL
- Ice works操作教程
- ICE原始碼研究原始碼
- v$segment_statistics_monitor段的使用情況
- Postman的Monitor功能Postman
- 使用sql monitor獲取更加詳細的執行計劃 - dbms_sqltune.report_sql_monitorSQL
- Guava併發:使用Monitor控制併發Guava
- 《ZeroC Ice權威指南》
- D. Ice Cream Balls
- TCP/IP、HTTP、WEBSERVICE、SOAP、ICE都使用後才有感慨TCPHTTPWeb
- DB2 Event Monitor使用與查詢DB2
- Table Monitor
- 可以幫你減肥的智慧背心:Thin Ice
- ZeroC ICE的遠端呼叫框架 Slice如何幫助我們進行Ice非同步程式設計(AMI,AMD)框架非同步程式設計
- 使用 dotnet-monitor 分析.NET 應用程式
- @ice/stark-data原始碼解析原始碼
- ICE中介軟體研究筆記筆記
- [Shell] monitor filesystem
- 2788647047_monitor
- DBMS_MONITOR使用 (In 10g, 11g and Above)
- 飛冰(ICE)4 月新動態
- WebRTC ICE 狀態與提名處理Web
- ICE 域名解析耗時太長
- 【SQL】Oracle SQL monitorSQLOracle
- Health Monitor簡介
- Monitor ASM DG IOASM
- aix_system_monitorAI
- 我們自研的 Ice 規則引擎開源了
- mysql的三個sql的monitor選項MySql
- ceph儲存的monitor選舉流程
- 使用工具Source Monitor測量您Java程式碼的環複雜度Java複雜度