青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(搬運工)Boost 不同Mutex的大體說明

Posted on 2012-07-18 10:58 點點滴滴 閱讀(9644) 評論(0)  編輯 收藏 引用 所屬分類: 02 編程語言

寫過多線程程序的人都知道,不能讓多個線程同時訪問共享的資源是至關重要的。假如一個線程試圖改變共享數據的值,而另外一個線程試圖去讀取該共享數據的值,結果將是未定義的。為了阻止這樣的事情發生,需要用到一些非凡的原始數據類型和操作。其中最重的一個就是總所周知的mutex(“mutual exclusion”的縮寫。譯注:相互排斥的意思,經常被翻譯為互斥體”)mutex在同一時間只能答應一個線程訪問共享資源。當一個線程需要訪問共享資源時,它必須先鎖住”mutex,假如任何其他線程已經鎖住了mutex,那么本操作將會一直被阻塞,直到鎖住了mutex的線程解鎖,這就保證了共享資源,在同一時間,只有一個線程可以訪問。

mutex的概念有幾個變種。Boost.Threads支持兩大類型的mutex:簡單mutex和遞歸mutex。一個簡單的mutex只能被鎖住一次,假如同一線程試圖兩次鎖定mutex,將會產生死鎖。對于遞歸mutex,一個線程可以多次鎖定一個mutex,但必須以同樣的次數對mutex進行解鎖,否則其他線程將無法鎖定該mutex

在上述兩大類mutex的基礎上,一個線程如何鎖定一個mutex也有些不同變化。一個線程有3種可能方法來鎖定mutex

1. 等待并試圖對mutex加鎖,直到沒有其他線程鎖定mutex

2. 試圖對mutex加鎖,并立即返回,假如其他線程鎖定了mutex

3. 等待并試圖對mutex加鎖,直到沒有其他線程鎖定mutex或者直到規定的時間已過。

看起來最好的mutex類型是遞歸的mutex了,因為上述3種加鎖的方式它都支持。不過,不同的加鎖方式有不同的消耗,因此對于特定的應用,Boost.Threads答應你挑選最有效率的mutex。為此,Boost.Threads提供了6中類型的mutex,效率由高到低排列:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive_try_mutexboost::recursive_timed_mutex

假如一個線程鎖定一個mutex后,而沒有解鎖,就會發生死鎖,這也是最為常見的錯誤了,為此,Boost.Threads專門進行了設計,可不直接對mutex加鎖或者解鎖操作,以使這種錯誤不可能發生(或至少很難發生)。取而代之地,mutex類定義了內嵌的typedef來實現RAII(Resource Acquisition In Initialization,譯注:在初始化時資源獲得)[4]用以對一個mutex進行加鎖或者解鎖,這就是所謂的Scoped Lock模式。要構建一個這種類型的鎖,需要傳送一個mutex引用,構造函數將鎖定mutex,析構函數將解鎖mutexC++語言規范確保了析構函數總是會被調用,所以即使有異常拋出,mutex也會被正確地解鎖。

這種模式確保了mutex的正確使用。不過必須清楚,盡管Scoped Lock模式保證了mutex被正確解鎖,但它不能保證在有異常拋出的時候,所有共享資源任然處于有效的狀態,所以,就像進行單線程編程一樣,必須確保異常不會讓程序處于不一致的狀態。同時,鎖對象不能傳送給另外一個線程,因為他們所維護的狀態不會受到此種用法的保護。

列表2舉例說明了boost::mutex類的一個簡單的用法。其中兩個線程被創建,每個循環10次,將id和當前循環計數輸出到std::coutmain線程等待著兩個線程結束。std::cout對象是一個共享資源,所以每個線程均使用全局mutex,以確保在同一時刻,只有一個線程輸出到它。

#include <boost/thread/thread.hpp>

#include <boost/thread/mutex.hpp>

#include <iostream>

boost::mutex io_mutex;

struct count

{

count(int id) : id(id) { }

void operator()()

{

for (int i = 0; i < 10; ++i)

{

boost::mutex::scoped_lock lock(io_mutex);

std::cout << id << ": " << i << std::endl;

}

}

int id;

};

int main(int argc, char* argv[])

{

boost::thread thrd1(count(1));

boost::thread thrd2(count(2));

thrd1.join();

thrd2.join();

return 0;

}

列表2

也許你已經注重到在列表2的代碼中,需要手工寫一個函數對象,才能向線程傳送數據。盡管代碼很簡單,但每次都要寫這樣的代碼也會讓人有單調沉悶之感。有另外一種更輕易的解決辦法,Functional庫可以讓你通過將需要傳入的數據綁定到另外一個函數對象的方式,來創建一個新的函數對象。列表3展現了Boost.Bind庫如何不寫函數對象,而簡化列表2中的代碼。

// This program is identical to listing2.cpp except that it uses

// Boost.Bind to simplify the creation of a thread that takes data.

#include <boost/thread/thread.hpp>

#include <boost/thread/mutex.hpp>

#include <boost/bind.hpp>

#include <iostream>

boost::mutex io_mutex;

void count(int id)

{

for (int i = 0; i < 10; ++i)

{

boost::mutex::scoped_lock lock(io_mutex);

std::cout << id << ": " << i << std::endl;

}

}

int main(int argc, char* argv[])

{

boost::thread thrd1(boost::bind(&count, 1)); // 有無&符號均可

boost::thread thrd2(boost::bind(&count, 2)); // 有無&符號均可

thrd1.join();

thrd2.join();

return 0;

}

列表3

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区91| 在线高清一区| 久久全球大尺度高清视频| 午夜精品一区二区三区在线视 | 国产精品欧美一区二区三区奶水| 欧美日韩成人在线播放| 欧美精品一区二区三区蜜臀| 欧美日韩国产大片| 欧美日韩免费观看一区=区三区| 欧美午夜一区二区三区免费大片| 国产精品视频99| 精品福利av| 亚洲精品乱码久久久久久久久| 亚洲美女网站| 午夜精品99久久免费| 久久久www| 亚洲国内精品| 亚洲麻豆视频| 欧美一二三区精品| 欧美电影在线观看完整版| 欧美午夜性色大片在线观看| 精品电影在线观看| 亚洲尤物在线| 欧美插天视频在线播放| 亚洲啪啪91| 欧美一级片一区| 欧美激情一区二区三区成人| 国产日韩欧美三级| 夜夜嗨av色综合久久久综合网| 欧美伊人久久久久久午夜久久久久| 久久久噜噜噜久久中文字幕色伊伊| 亚洲国产91| 欧美在线一二三四区| 欧美日韩小视频| 亚洲国产激情| 久久精品国产99国产精品| 亚洲精品美女91| 久久天天躁狠狠躁夜夜av| 国产精品一区二区你懂得| 亚洲精品欧美在线| 美女诱惑一区| 欧美一区免费视频| 国产精品色网| 一区二区三区黄色| 亚洲国产成人tv| 久久久欧美精品| 国产日韩欧美亚洲| 亚洲欧美一区二区在线观看| 亚洲黄色av| 亚洲国产日韩欧美在线图片 | 久久久久久穴| 国产精品视频一区二区高潮| 一本色道精品久久一区二区三区| 久久综合网色—综合色88| 在线亚洲精品福利网址导航| 免费在线播放第一区高清av| 国内成人自拍视频| 久久精品人人做人人综合 | 亚洲午夜一区| 欧美日韩一区二区三区视频| 亚洲黄色免费| 欧美韩日高清| 欧美福利视频在线| 日韩视频永久免费| 亚洲福利视频网| 欧美激情中文字幕在线| 亚洲精品1区2区| 欧美激情 亚洲a∨综合| 久久久福利视频| 亚洲福利视频专区| 亚洲第一精品影视| 欧美日韩aaaaa| 午夜欧美理论片| 欧美一区二区大片| 韩国女主播一区| 欧美成人免费va影院高清| 免费在线日韩av| 一区二区三区产品免费精品久久75| 亚洲久久一区二区| 国产精品普通话对白| 欧美一区午夜视频在线观看| 欧美中文字幕不卡| 最新国产の精品合集bt伙计| 亚洲精品国产精品乱码不99| 欧美日韩福利| 久久精品99国产精品| 久久先锋影音av| 亚洲三级免费电影| 日韩亚洲欧美在线观看| 国产一区二区剧情av在线| 欧美黄色精品| 国产精品乱码妇女bbbb| 久久日韩精品| 欧美日韩高清区| 久久久免费av| 欧美日韩午夜剧场| 久久一区二区三区四区五区| 欧美成人精品在线| 欧美一区二区三区四区在线观看地址 | 久久五月天婷婷| 欧美日韩国产成人精品| 久久婷婷国产综合尤物精品| 欧美日韩综合一区| 免费在线欧美视频| 国产精品久久婷婷六月丁香| 国产午夜精品一区二区三区欧美 | 免费在线看成人av| 欧美日韩xxxxx| 美女免费视频一区| 国产精品国产三级国产普通话99 | 久久久久99| 亚洲综合99| 欧美粗暴jizz性欧美20| 欧美一区二区三区啪啪| 欧美黄色网络| 美女视频黄免费的久久| 国产精品网红福利| 最新国产精品拍自在线播放| 国产一区二区毛片| 中文精品在线| 日韩网站在线观看| 久久久亚洲影院你懂的| 西瓜成人精品人成网站| 欧美欧美全黄| 亚洲第一伊人| 在线免费观看日韩欧美| 西瓜成人精品人成网站| 亚洲深夜福利网站| 欧美国产视频在线| 看欧美日韩国产| 国产一区二区日韩精品欧美精品| 亚洲视频一区在线观看| 亚洲最新在线| 免费欧美网站| 欧美国产精品专区| 加勒比av一区二区| 欧美在线视频全部完| 久久精品欧美日韩精品| 国产视频不卡| 久久不射2019中文字幕| 久久婷婷国产麻豆91天堂| 狠狠色2019综合网| 久久夜色精品国产欧美乱极品| 老司机午夜精品视频在线观看| 国产亚洲一区二区三区在线播放 | 欧美成人免费大片| 欧美a级片一区| 亚洲国产你懂的| 你懂的国产精品永久在线| 女女同性女同一区二区三区91| 激情六月综合| 你懂的一区二区| 亚洲精选视频在线| 性色av一区二区三区在线观看 | 99精品视频网| 欧美色区777第一页| 亚洲性夜色噜噜噜7777| 久久成人综合网| 欧美成人精品不卡视频在线观看| 99视频精品| 久久免费少妇高潮久久精品99| 久久视频在线免费观看| 一区二区三区国产在线| 国产女同一区二区| 在线一区二区日韩| 亚洲视频免费在线| 国产欧美精品va在线观看| 欧美在线网址| 亚洲国产日韩欧美一区二区三区| 亚洲伦理一区| 国产精品免费看久久久香蕉| 欧美一区二区黄色| 亚洲激情自拍| 亚洲欧美日韩一区在线| 激情久久综合| 欧美日韩国产在线看| 亚洲欧美日韩一区二区| 欧美成人嫩草网站| 午夜久久电影网| 亚洲国产一区二区三区青草影视| 欧美日韩午夜视频在线观看| 欧美亚洲一区三区| 亚洲免费久久| 久久亚洲综合网| 亚洲在线不卡| 1000部国产精品成人观看| 欧美三级午夜理伦三级中文幕 | 欧美在线观看网址综合| 亚洲激情网址| 国产精品综合不卡av| 欧美高清在线观看| 久久爱www.| 亚洲一区网站| 亚洲精品日日夜夜| 欧美+日本+国产+在线a∨观看| 午夜老司机精品| 亚洲天堂久久| 99精品欧美一区二区三区综合在线| 在线观看久久av| 韩国亚洲精品|