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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

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

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

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

    [cpp] view plaincopy
  • #include?<IceUtil/RecMutex.h>??
  • ??
  • IceUtil::RecMutex?_mutex;?//?Recursive?mutex??
  • ??
  • void?f1()??
  • {??
  • [cpp] view plaincopy
  • ???????IceUtil::RecMutex::Lock?lock(_mutex);???//如果該互斥體已被其他線程加鎖,那么該線程將會(huì)被掛起??
  • ????????//?...??
  • }??
  • ??
  • void?f2()??
  • {??
  • ???????IceUtil::RecMutex::Lock?lock(_mutex);??
  • ???????f1();?//?Fine??
  • ???????//...??
  • }??
  • ????
  • 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;?//這個(gè)函數(shù)掛起調(diào)用它的線程,直到指定的時(shí)間流逝.如果在超時(shí)之前喚醒被掛起的線程,??
  • ??
  • ????????????????????????????????????????????????????????????????????????????????????//這個(gè)調(diào)用就返回true;否則返回false。??
  • ??????????????????????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ò),歡迎將生活随笔推薦給好友。