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

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>
            免费成人高清视频| 久久影视精品| 亚洲综合999| 麻豆av一区二区三区久久| 午夜精品久久| 亚洲伦理自拍| 99精品国产在热久久下载| 亚洲二区视频| 久久天天躁狠狠躁夜夜av| 久久久精品日韩欧美| 午夜精品久久久久久久久久久久久 | 欧美少妇一区| 国产精品久久99| 国产精品xxxxx| 欧美亚洲第一区| 国产欧美精品va在线观看| 欧美天堂亚洲电影院在线观看| 欧美三区不卡| 国产精品国产三级国产专播精品人| 欧美精品成人| 国产精品免费视频观看| 国产欧美日韩亚洲| 欧美激情1区2区3区| 日韩视频在线观看免费| 亚洲日本va午夜在线影院| 最近中文字幕日韩精品| 亚洲在线播放| 久久成人精品| 亚洲国产天堂久久综合网| 欧美大片免费观看| 亚洲精品自在久久| 久久九九免费| 欧美国产日韩一区二区三区| 欧美日韩一区视频| 国产精品一区在线观看| 91久久精品国产91性色| 一区二区三区精品| 欧美一级二区| 欧美日韩精品一区二区天天拍小说 | 国产精品自拍一区| 亚洲日韩欧美视频一区| 一区二区高清| 蜜桃精品久久久久久久免费影院| 亚洲精品免费网站| 亚洲欧美一区二区三区极速播放| 欧美a级大片| 国产精品网站在线观看| 日韩亚洲视频| 久久精品日产第一区二区| 欧美国产日韩在线| 久久国产精品72免费观看| 欧美高清视频一区二区三区在线观看| 国产精品一区免费观看| 亚洲欧洲一级| 欧美中文字幕久久| 亚洲午夜精品福利| 欧美jjzz| 亚洲精品久久久久久久久久久 | 羞羞色国产精品| 亚洲天堂av电影| 欧美r片在线| 亚洲在线观看视频| 欧美在线视频a| aa成人免费视频| 久久久五月天| 激情另类综合| 日韩一级在线| 亚洲电影成人| 老牛影视一区二区三区| 国内精品嫩模av私拍在线观看 | 亚洲精品一区二区网址| 久久久欧美精品sm网站| 亚洲激情另类| 久久国产精品高清| 国产精品视频第一区| 亚洲一区日韩在线| 亚洲社区在线观看| 国产精品白丝黑袜喷水久久久| 亚洲特级毛片| 一本久道久久综合婷婷鲸鱼| 欧美激情bt| 亚洲午夜成aⅴ人片| 91久久久在线| 国产精品久久久久久久第一福利 | 欧美精品二区三区四区免费看视频| 精品99一区二区三区| 免费在线观看日韩欧美| 久久精品30| 一区二区三区高清在线| 国产女主播一区| 久久精品成人| 欧美激情国产日韩| 日韩亚洲精品电影| 亚洲乱码国产乱码精品精可以看| 亚洲第一黄网| 欧美日本高清一区| 欧美一区二区三区在线观看| 亚洲一区国产精品| 国产视频久久网| 久久精品国产999大香线蕉| 欧美一级午夜免费电影| 黑丝一区二区三区| 欧美中文字幕久久| 久久字幕精品一区| 日韩午夜激情av| 午夜精品成人在线| 狠狠久久亚洲欧美| 一本色道久久加勒比88综合| 国产精品地址| 久久久一区二区| 国产精品swag| 久久精品国产一区二区三区免费看| 葵司免费一区二区三区四区五区| 亚洲成人自拍视频| 久久野战av| 欧美日韩岛国| 欧美在线观看视频一区二区三区| 欧美国产精品一区| 午夜精品国产更新| 欧美精品自拍| 久久久国产一区二区| 欧美一级久久久| 99国产精品久久久久久久成人热 | 蜜桃久久av一区| 在线视频日韩| 欧美成人一区二区三区| 香蕉久久精品日日躁夜夜躁| 99re视频这里只有精品| 亚洲精品在线三区| 激情亚洲一区二区三区四区| 欧美激情精品久久久六区热门| 欧美日韩国产一区二区三区| 女人香蕉久久**毛片精品| 欧美三级日本三级少妇99| 欧美激情精品久久久| 国产日韩欧美在线看| 久久综合五月| 好男人免费精品视频| 亚洲天堂av在线免费观看| 亚洲深夜福利视频| 久久综合中文色婷婷| 久久综合色婷婷| 国产精品久久久久国产a级| 国产日韩久久| 亚洲综合好骚| 亚洲电影av在线| 母乳一区在线观看| 老司机精品久久| 黄色国产精品一区二区三区| 一区二区三区欧美亚洲| 亚洲自拍偷拍色片视频| 欧美精品1区| 日韩午夜三级在线| 一本大道久久a久久精二百| 美女被久久久| 蜜桃视频一区| 国内在线观看一区二区三区| 久久久999精品免费| 欧美中文字幕在线视频| 国产一区二区三区黄| 亚洲欧美电影院| 老司机免费视频一区二区三区| 国产三区精品| 久久最新视频| 亚洲国产成人av好男人在线观看| 亚洲成色777777女色窝| 欧美激情一二三区| 亚洲国产精品久久久久婷婷884| 亚洲激精日韩激精欧美精品| 久热精品视频在线观看一区| 欧美国产日产韩国视频| 91久久夜色精品国产九色| 久久久久成人精品| 亚洲欧美中文日韩v在线观看| 美女网站在线免费欧美精品| 欧美国产视频在线观看| 亚洲免费电影在线| 欧美日本亚洲视频| 亚洲色无码播放| 99精品热视频| 国产亚洲精品久久久久婷婷瑜伽| 午夜精品一区二区三区在线视 | 亚洲国产欧美在线人成| 欧美v日韩v国产v| 欧美国产先锋| 香蕉久久一区二区不卡无毒影院| 国产欧美日韩综合精品二区| 欧美精品一区二区三区蜜桃| 亚洲美女啪啪| 免费日韩视频| 亚洲午夜久久久久久久久电影院 | 1000部国产精品成人观看 | 国产精品高清在线| 国产精品网站视频| 日韩亚洲不卡在线| 午夜精品理论片| 国产亚洲精品久| 久久久久久久综合狠狠综合| 欧美成人免费全部| 一本久道久久综合狠狠爱|