日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Ice笔记--C++线程与并发(小结)

發布時間:2025/3/21 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;?/*lock?函數嘗試獲取互斥體。如果互斥體已經鎖住,它就會掛起發出調用的線程(calling?thread),直到互斥體變得可用為止*/??
  • ??
  • ????????bool?tryLock()?const;/*trylock函數嘗試獲取互斥體。如果互斥體未被鎖住則返回true,否則直接返回false*/??
  • ????????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;??
  • //if(somecondition)return?;??
  • ??_fileMutex.unlock();??
  • }??
  • ??????然而這種加入互斥機制的方法并不好,例如對互斥體加鎖了但在函數返回時并沒有實現解鎖操作,這種情況下就引發死鎖情況。

    ??????因此我們建議使用Ice提供的兩個助手類Lock和TryLock,如下:

    [cpp] view plaincopy
  • voidSomeClass::someFunction(/*?params?here...?*/)??
  • {??
  • ???????IceUtil::Mutex::Locklock(_mutex);?//?對mutex對象加鎖??
  • ????????//?Lots?of?complexcode?here...??
  • ???????if?(someCondition)?{??
  • ????????????return;???????//?No?problem??
  • ???????}??
  • ???????//...??
  • }?//?此處調用Mutex類對象的析構函數,同時會解除互斥鎖的加鎖狀態。??
  • 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();????//?Deadlock!??
  • ????//?...??
  • }??
  • ?????????為了解決這個問題,Ice同樣也提供了遞歸互斥鎖,如下示例:

    [cpp] view plaincopy
  • #include?<IceUtil/RecMutex.h>??
  • ??
  • IceUtil::RecMutex?_mutex;?//?Recursive?mutex??
  • ??
  • void?f1()??
  • {??
  • [cpp] view plaincopy
  • ???????IceUtil::RecMutex::Lock?lock(_mutex);???//如果該互斥體已被其他線程加鎖,那么該線程將會被掛起??
  • ????????//?...??
  • }??
  • ??
  • void?f2()??
  • {??
  • ???????IceUtil::RecMutex::Lock?lock(_mutex);??
  • ???????f1();?//?Fine??
  • ???????//...??
  • }??
  • ????
  • 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;?//這個函數掛起調用它的線程,直到指定的時間流逝.如果在超時之前喚醒被掛起的線程,??
  • ??
  • ????????????????????????????????????????????????????????????????????????????????????//這個調用就返回true;否則返回false。??
  • ??????????????????????void?notify();??
  • ???????????????????void?notifyAll();??
  • ??
  • ???????????????????typedefLockT<Monitor<T>?>?Lock;??
  • ???????????????????typedefTryLockT<Monitor<T>?>?TryLock;??
  • ?????????};??
  • }??
  • ??
  • ???
  • ??? Monitor類相對于互斥體來說,它提供的互斥機制更為靈活,因為他們允許線程檢查某一條件,如果條件為假,就讓自己休眠;而這線程會讓其他某個改變了條件狀態的線程喚醒。

    ?? 關于如何使用該Monitor類,可以參考上一篇文章--C++線程與并發(二)。

    總結

    以上是生活随笔為你收集整理的Ice笔记--C++线程与并发(小结)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。