成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > linux中編寫自己的并發(fā)隊(duì)列類(Queue 并發(fā)阻塞隊(duì)列)

linux中編寫自己的并發(fā)隊(duì)列類(Queue 并發(fā)阻塞隊(duì)列)

熱門標(biāo)簽:河南信譽(yù)好的不封卡電話外呼系統(tǒng) 如果做線上地圖標(biāo)注 地圖標(biāo)注員都是年輕人 華鋒e路航港口地圖標(biāo)注 百度地圖標(biāo)注錯(cuò)了有責(zé)任嗎 揭陽智能電話機(jī)器人推薦 江蘇云電銷機(jī)器人公司 客服外呼系統(tǒng)怎么樣 打電話機(jī)器人接我是他的秘書

設(shè)計(jì)并發(fā)隊(duì)列

復(fù)制代碼 代碼如下:

#include pthread.h>
#include list>
using namespace std;

template typename T>
class Queue
{
public:
    Queue( )
    {
        pthread_mutex_init(_lock, NULL);
    }
    ~Queue( )
    {
        pthread_mutex_destroy(_lock);
    }
    void push(const T data);
    T pop( );
private:
    listT> _list;
    pthread_mutex_t _lock;
};

template typename T>
void QueueT>::push(const T value )
{
    pthread_mutex_lock(_lock);
    _list.push_back(value);
    pthread_mutex_unlock(_lock);
}

template typename T>
T QueueT>::pop( )
{
    if (_list.empty( ))
    {
        throw "element not found";
    }
    pthread_mutex_lock(_lock);
    T _temp = _list.front( );
    _list.pop_front( );
    pthread_mutex_unlock(_lock);
    return _temp;
}

上述代碼是有效的。但是,請考慮這樣的情況:您有一個(gè)很長的隊(duì)列(可能包含超過 100,000 個(gè)元素),而且在代碼執(zhí)行期間的某個(gè)時(shí)候,從隊(duì)列中讀取數(shù)據(jù)的線程遠(yuǎn)遠(yuǎn)多于添加數(shù)據(jù)的線程。因?yàn)樘砑雍腿〕鰯?shù)據(jù)操作使用相同的互斥鎖,所以讀取數(shù)據(jù)的速度會影響寫數(shù)據(jù)的線程訪問鎖。那么,使用兩個(gè)鎖怎么樣?一個(gè)鎖用于讀取操作,另一個(gè)用于寫操作。給出修改后的 Queue 類。

復(fù)制代碼 代碼如下:

template typename T>
class Queue
{
public:
    Queue( )
    {
        pthread_mutex_init(_rlock, NULL);
        pthread_mutex_init(_wlock, NULL);
    }
    ~Queue( )
    {
        pthread_mutex_destroy(_rlock);
        pthread_mutex_destroy(_wlock);
    }
    void push(const T data);
    T pop( );
private:
    listT> _list;
    pthread_mutex_t _rlock, _wlock;
};


template typename T>
void QueueT>::push(const T value )
{
    pthread_mutex_lock(_wlock);
    _list.push_back(value);
    pthread_mutex_unlock(_wlock);
}

template typename T>
T QueueT>::pop( )
{
    if (_list.empty( ))
    {
        throw "element not found";
    }
    pthread_mutex_lock(_rlock);
    T _temp = _list.front( );
    _list.pop_front( );
    pthread_mutex_unlock(_rlock);
    return _temp;
}

設(shè)計(jì)并發(fā)阻塞隊(duì)列

目前,如果讀線程試圖從沒有數(shù)據(jù)的隊(duì)列讀取數(shù)據(jù),僅僅會拋出異常并繼續(xù)執(zhí)行。但是,這種做法不總是我們想要的,讀線程很可能希望等待(即阻塞自身),直到有數(shù)據(jù)可用時(shí)為止。這種隊(duì)列稱為阻塞的隊(duì)列。如何讓讀線程在發(fā)現(xiàn)隊(duì)列是空的之后等待?一種做法是定期輪詢隊(duì)列。但是,因?yàn)檫@種做法不保證隊(duì)列中有數(shù)據(jù)可用,它可能會導(dǎo)致浪費(fèi)大量 CPU 周期。推薦的方法是使用條件變量,即 pthread_cond_t 類型的變量。

復(fù)制代碼 代碼如下:

template typename T>
class BlockingQueue
{
public:
    BlockingQueue ( )
    {
        pthread_mutexattr_init(_attr);
        // set lock recursive
        pthread_mutexattr_settype(_attr,PTHREAD_MUTEX_RECURSIVE_NP);
        pthread_mutex_init(_lock,_attr);
        pthread_cond_init(_cond, NULL);
    }
    ~BlockingQueue ( )
    {
        pthread_mutex_destroy(_lock);
        pthread_cond_destroy(_cond);
    }
    void push(const T data);
    bool push(const T data, const int seconds); //time-out push
    T pop( );
    T pop(const int seconds); // time-out pop

private:
    listT> _list;
    pthread_mutex_t _lock;
    pthread_mutexattr_t _attr;
    pthread_cond_t _cond;
};

template typename T>
T BlockingQueueT>::pop( )
{
    pthread_mutex_lock(_lock);
    while (_list.empty( ))
    {
        pthread_cond_wait(_cond, _lock) ;
    }
    T _temp = _list.front( );
    _list.pop_front( );
    pthread_mutex_unlock(_lock);
    return _temp;
}

template typename T>
void BlockingQueue T>::push(const T value )
{
    pthread_mutex_lock(_lock);
    const bool was_empty = _list.empty( );
    _list.push_back(value);
    pthread_mutex_unlock(_lock);
    if (was_empty)
        pthread_cond_broadcast(_cond);
}

并發(fā)阻塞隊(duì)列設(shè)計(jì)有兩個(gè)要注意的方面:

1.可以不使用 pthread_cond_broadcast,而是使用 pthread_cond_signal。但是,pthread_cond_signal 會釋放至少一個(gè)等待條件變量的線程,這個(gè)線程不一定是等待時(shí)間最長的讀線程。盡管使用 pthread_cond_signal 不會損害阻塞隊(duì)列的功能,但是這可能會導(dǎo)致某些讀線程的等待時(shí)間過長。

2.可能會出現(xiàn)虛假的線程喚醒。因此,在喚醒讀線程之后,要確認(rèn)列表非空,然后再繼續(xù)處理。強(qiáng)烈建議使用基于 while 循環(huán)的 pop()。

設(shè)計(jì)有超時(shí)限制的并發(fā)阻塞隊(duì)列

在許多系統(tǒng)中,如果無法在特定的時(shí)間段內(nèi)處理新數(shù)據(jù),就根本不處理數(shù)據(jù)了。例如,新聞?lì)l道的自動收報(bào)機(jī)顯示來自金融交易所的實(shí)時(shí)股票行情,它每 n 秒收到一次新數(shù)據(jù)。如果在 n 秒內(nèi)無法處理以前的一些數(shù)據(jù),就應(yīng)該丟棄這些數(shù)據(jù)并顯示最新的信息。根據(jù)這個(gè)概念,我們來看看如何給并發(fā)隊(duì)列的添加和取出操作增加超時(shí)限制。這意味著,如果系統(tǒng)無法在指定的時(shí)間限制內(nèi)執(zhí)行添加和取出操作,就應(yīng)該根本不執(zhí)行操作。

復(fù)制代碼 代碼如下:

template typename T>
bool BlockingQueue T>::push(const T data, const int seconds)
{
    struct timespec ts1, ts2;
    const bool was_empty = _list.empty( );
    clock_gettime(CLOCK_REALTIME, ts1);
    pthread_mutex_lock(_lock);
    clock_gettime(CLOCK_REALTIME, ts2);
    if ((ts2.tv_sec – ts1.tv_sec) seconds)
    {
        was_empty = _list.empty( );
        _list.push_back(value);
    }
    pthread_mutex_unlock(_lock);
    if (was_empty)
        pthread_cond_broadcast(_cond);
}

template typename T>
T BlockingQueue T>::pop(const int seconds)
{
    struct timespec ts1, ts2;
    clock_gettime(CLOCK_REALTIME, ts1);
    pthread_mutex_lock(_lock);
    clock_gettime(CLOCK_REALTIME, ts2);

    // First Check: if time out when get the _lock
    if ((ts1.tv_sec – ts2.tv_sec) seconds)
    {
        ts2.tv_sec += seconds; // specify wake up time
        while(_list.empty( ) (result == 0))
        {
            result = pthread_cond_timedwait(_cond, _lock, ts2) ;
        }
        if (result == 0) // Second Check: if time out when timedwait 
        {
            T _temp = _list.front( );
            _list.pop_front( );
            pthread_mutex_unlock(_lock);
            return _temp;
        }
    }
    pthread_mutex_unlock(lock);
    throw "timeout happened";
}

設(shè)計(jì)有大小限制的并發(fā)阻塞隊(duì)列

最后,討論有大小限制的并發(fā)阻塞隊(duì)列。這種隊(duì)列與并發(fā)阻塞隊(duì)列相似,但是對隊(duì)列的大小有限制。在許多內(nèi)存有限的嵌入式系統(tǒng)中,確實(shí)需要有大小限制的隊(duì)列。
對于阻塞隊(duì)列,只有讀線程需要在隊(duì)列中沒有數(shù)據(jù)時(shí)等待。對于有大小限制的阻塞隊(duì)列,如果隊(duì)列滿了,寫線程也需要等待。

復(fù)制代碼 代碼如下:

template typename T>
class BoundedBlockingQueue
{
public:
    BoundedBlockingQueue (int size) : maxSize(size)
    {
        pthread_mutex_init(_lock, NULL);
        pthread_cond_init(_rcond, NULL);
        pthread_cond_init(_wcond, NULL);
        _array.reserve(maxSize);
    }
    ~BoundedBlockingQueue ( )
    {
        pthread_mutex_destroy(_lock);
        pthread_cond_destroy(_rcond);
        pthread_cond_destroy(_wcond);
    }
    void push(const T data);
    T pop( );
private:
    vectorT> _array; // or T* _array if you so prefer
    int maxSize;
    pthread_mutex_t _lock;
    pthread_cond_t _rcond, _wcond;
};

template typename T>
void BoundedBlockingQueue T>::push(const T value )
{
    pthread_mutex_lock(_lock);
    const bool was_empty = _array.empty( );
    while (_array.size( ) == maxSize)
    {
        pthread_cond_wait(_wcond, _lock);
    }
    _array.push_back(value);
    pthread_mutex_unlock(_lock);
    if (was_empty)
        pthread_cond_broadcast(_rcond);
}

template typename T>
T BoundedBlockingQueueT>::pop( )
{
    pthread_mutex_lock(_lock);
    const bool was_full = (_array.size( ) == maxSize);
    while(_array.empty( ))
    {
        pthread_cond_wait(_rcond, _lock) ;
    }
    T _temp = _array.front( );
    _array.erase( _array.begin( ));
    pthread_mutex_unlock(_lock);
    if (was_full)
        pthread_cond_broadcast(_wcond);
    return _temp;
}

要注意的第一點(diǎn)是,這個(gè)阻塞隊(duì)列有兩個(gè)條件變量而不是一個(gè)。如果隊(duì)列滿了,寫線程等待 _wcond 條件變量;讀線程在從隊(duì)列中取出數(shù)據(jù)之后需要通知所有線程。同樣,如果隊(duì)列是空的,讀線程等待 _rcond 變量,寫線程在把數(shù)據(jù)插入隊(duì)列中之后向所有線程發(fā)送廣播消息。如果在發(fā)送廣播通知時(shí)沒有線程在等待 _wcond 或 _rcond,會發(fā)生什么?什么也不會發(fā)生;系統(tǒng)會忽略這些消息。還要注意,兩個(gè)條件變量使用相同的互斥鎖。

 

您可能感興趣的文章:
  • linux中高并發(fā)socket最大連接數(shù)的優(yōu)化詳解
  • Linux netstat命令查看并發(fā)連接數(shù)的方法
  • Linux下高并發(fā)socket最大連接數(shù)所受的各種限制(詳解)
  • linux并發(fā)連接50萬的配置方法
  • 淺談Linux環(huán)境下并發(fā)編程中C語言fork()函數(shù)的使用
  • Linux下apache如何限制并發(fā)連接和下載速度
  • Linux并發(fā)執(zhí)行很簡單,這么做就對了

標(biāo)簽:許昌 赤峰 邵陽 巴彥淖爾 淘寶邀評 婁底 金昌 馬鞍山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux中編寫自己的并發(fā)隊(duì)列類(Queue 并發(fā)阻塞隊(duì)列)》,本文關(guān)鍵詞  linux,中,編寫,自己的,并發(fā),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux中編寫自己的并發(fā)隊(duì)列類(Queue 并發(fā)阻塞隊(duì)列)》相關(guān)的同類信息!
  • 本頁收集關(guān)于linux中編寫自己的并發(fā)隊(duì)列類(Queue 并發(fā)阻塞隊(duì)列)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    成人国内精品久久久久一区| 日韩av手机版| 91国产精品视频在线观看| 久久久av毛片精品| 欧美日韩的一区二区| 久久免费的精品国产v∧| 中国日本在线视频中文字幕| 国产亚洲人成a在线v网站| 国产欧美日韩综合| 第一次破处视频| 欧美黑人激情| 能免费看av的网站| 性疯狂做受xxxx高清视频| 成午夜精品一区二区三区软件| 97精品一区二区视频在线观看| 成人精品一区二区三区免费| 国产精品欧美综合| 涩涩视频网站在线观看| 午夜午夜精品一区二区三区文| 国产精品日日摸夜夜摸av| 国产成人综合网站| 在线亚洲伦理| 国产ts人妖一区二区| www.噜噜色.com| 不卡的av电影在线观看| 在线观看免费视频高清游戏推荐| 亚洲成人原创| 久久久久久久久毛片| 久久av无码精品人妻系列试探| 91精品国产91久久久久游泳池| 一二三四区在线| 国产精品自拍第一页| 国产在线观看无码免费视频| 久久精品免费电影| 日韩精品高清不卡| 视频三区二区一区| 快射av在线播放一区| 小舞被吸乳羞羞网站视频| 精品一区二区三区日韩| 超碰资源在线| 韩国三级电影在线观看婷婷| 欧美一区影院| 人妻精品无码一区二区三区| 欧美日韩性视频| 日韩国产伦理| 日韩免费高清av| 亚洲精选一区二区三区| 日韩精品一区二区三区在线视频| 亚洲成人黄色小说| 亚洲亚洲一区二区三区| 精品九九在线| 欧美jizz18hd性欧美| 综合久久亚洲| 五月婷婷激情五月| 久久精品99久久久| 亚洲va在线| 国产精品久久久久久麻豆一区软件| 日本免费在线视频| 另类图片亚洲色图| 精品国产美女a久久9999| 久久久久中文字幕亚洲精品| 性久久久久久久久久久久| 欧美日韩国产美| 国产老女人精品毛片久久| 国产精品天天看天天狠| 99热这里只有精品66| 最新理论片影院| 欧美日韩国产专区| 日韩一级大片| 国产精品视频免费一区二区三区| 国产成人精品视频一区| 欧美人体做爰大胆视频| 91av国产在线| 精品国产乱码久久久久久鸭王1| jizz一区二区三区| 日韩高清av在线| 国产精品久久久久久久久久10秀| 欧美hd在线| 小早川怜子一区二区三区| 欧美成人精品福利| 一出一进一爽一粗一大视频| 蜜桃视频在线观看www社区| 在线免费看av片| 国产一区二区三区不卡在线观看| 性色av蜜臀av| 亚洲一区二区精品3399| 欧美日韩国产免费一区二区| 黄网在线观看网址入口| 欧美123区| 亚洲国产日韩欧美在线图片| 四虎4545www精品视频| 亚洲人成伊人成综合网小说| 久久久高清一区二区三区| 日韩一级片免费在线观看| 狠狠色综合欧美激情| 亚欧美一区二区三区| 欧美激情一区二区视频| 国产一区二区按摩在线观看| 在线播放欧美女士性生活| 精品国产一区二区三区2021| 久久嫩草精品久久久精品| 蜜桃一级网站.| 欧美片第1页综合| 一二三区高清| 亚洲精品国产偷自在线观看| 国产成人精品亚洲777人妖| 亚洲精品人妻无码| 夜夜摸夜夜操| 黄色片在线观看免费| 日韩欧美一区二区在线视频| 91探花福利精品国产自产在线| 无码精品一区二区三区在线| 日本特级黄色大片| 亚洲校园激情春色| 久久综合社区| 国产高清不卡无码视频| 色悠久久久久综合先锋影音下载| 欧美精品黑人猛交高潮| 欧美精品一区二区精品网| www.蜜桃av| 欧美整片在线观看| 老司机99精品99| 性猛交xxxx乱大交孕妇印度| 极品日韩av| 一个人免费播放在线视频看片| 国产丝袜在线精品| 97人人模人人爽人人喊中文字| 欧美一区二区三区不卡视频| 日韩免费在线电影| 欧美激情免费| 国产在线精品日韩| 久久精品国产第一区二区三区| 国产精品第一国产精品| 中文字幕乱在线伦视频中文字幕乱码在线| 欧洲综合视频| 欧美高清在线| 欧洲成人免费aa| 久久99国内精品| 狂野欧美xxxx韩国少妇| 亚洲网站视频福利| 久久综合丝袜日本网| www.亚洲免费av| 亚洲午夜精品久久| 国产婷婷色综合av蜜臀av| 国产成人a v| 妖精一区二区三区精品视频| 国产精品第12页| www.91popny.com| 久操视频在线免费播放| jizz欧美性11| 中文字幕中文字幕在线十八区| 日韩 国产 一区| 日韩精品一区二区三区免费观影| 中文字幕日韩一区| 啪啪国产精品| 国产欧美日韩综合精品一区二区| 亚洲精品视频在线播放| 91精品一久久香蕉国产线看观看| 手机在线免费看毛片| 亚洲国产天堂av| 欧美福利视频导航| 欧美一级特黄a| 26uuu欧美| 亚洲综合日韩| 国产精品影院在线观看| palipali轻量版永久网页入口| 91精品国产91久久久久久| 手机在线观看日韩av| 色综合久久久久久中文网| 国产精品毛片在线看| 日日噜噜夜夜狠狠久久丁香五月| 欧美视频亚洲色图| yourporn在线观看中文站| 精品久久中文字幕久久av| 亚洲国产精品人人爽夜夜爽| 亚洲男人电影天堂| 97人妻精品一区二区三区动漫| 国产男女裸体做爰爽爽| 亚洲欧洲自拍偷拍| 日本xxxx裸体xxxx| 久久夜色精品国产欧美乱极品| 亚洲成人福利片| 亚洲精品视频99| 国产精品久久天天影视| 日本在线视频网| 久久久久亚洲av无码专区桃色| 欧美深深色噜噜狠狠yyy| 日韩avxxx| 777片理伦片在线观看| 久久久999成人| 日韩久久99| 亚洲黄色高清| 91九色在线观看| 91蝌蚪porny| 日韩女优av电影| 欧美激情综合色综合啪啪五月| 免费黄色在线播放| 一级片视频免费看| 久久视频国产精品免费视频在线| 中文字幕第80页| 欧洲美女免费图片一区| 日韩欧美www| 精品国产一区二区三区久久久蜜臀| 日韩高清中文字幕一区二区| www.999av| 亚洲黄色小视频在线观看| 国产男女在线观看| 欧美一级视频在线播放| 国产超碰在线一区| 国产精品白丝av| 91在线免费视频| av网站一区二区三区| 天天爽天天狠久久久| 久久五月婷婷丁香社区| 免费一区二区三区| 香蕉视频国产精品| 祥仔av免费一区二区三区四区| 日韩激情中文字幕| 俺去啦最新地址| 日韩精品在在线一区二区中文| 蜜桃日韩视频| xxxx性bbbb欧美野外| 自拍偷拍欧美视频| 免费久久99精品国产| 欧美成人精精品一区二区频| 国产福利精品一区二区| 欧美国产一级片| 国产精品大片wwwwww| 国产欧美精品区一区二区三区| 欧美大胆a视频| 免费看污视频的网站| 色综合导航网站| 成人天堂噜噜噜| 岛国av午夜精品| 亚洲国产精品无码久久久久高潮| 少妇久久久久久被弄高潮| 波多野结衣电影在线播放| 蜜桃成人免费视频| 中文字幕在线免费专区| 欧美色图一区二区| 猛男gaygay欧美视频| 欧美人与性动交a欧美精品| 色网在线免费观看| 天堂在线资源网| 免费看又黄又无码的网站| 日日摸日日添日日躁av| 手机看片日韩国产| 国产麻豆免费观看| 欧美国产欧美综合| 黄色影院在线观看| 欧美日韩中文字幕| 国产99久一区二区三区a片| 日本色图欧美色图| 日本免费中文字幕在线| 性一交一乱一伦一色一情| 国产精品久久一区| 中文字幕资源网在线观看| 日韩美女久久久| 国产高清不卡二三区| 欧美蜜桃一区二区三区| 肉色超薄丝袜脚交69xx图片| 老司机av网站| 很黄很黄的网站免费的| 美国黄色小视频| 欧美视频小说| 欧美人与动牲交xxxxbbbb| 成人自拍视频在线观看| 国产成人精品av在线| 一区二区三区四区视频免费观看| 99草在线视频| 国产91免费在线观看| 97品白浆高清久久久久久| 91文字幕巨乱亚洲香蕉| 国产一区二区三区成人| 国产高清999| 日本又骚又刺激的视频在线观看| 久久久久网址| 欧美一区二区三区成人精品| 中文视频一区| 黄色污污在线观看| 久久久99爱| 久久久久久久999精品视频| 性色av一区二区三区红粉影视| 亚洲美女自拍视频| 日本人妻一区二区三区| 777电影在线观看| 国产又粗又猛又爽又黄91精品| 欧美成人精品一区二区综合免费| 国产亚洲1区2区3区| 一区二区三区视频播放| 色一情一乱一伦一区二区三区丨| 奇米亚洲午夜久久精品| 一区二区三区四区五区精品视频| 国产精品白丝久久av网站| 黄色录像1级片| 中文字幕42页丝袜| www..com日韩| 一本到三区不卡视频| 狠狠色综合欧美激情| 久久久久久久久免费视频| 日本少妇精品亚洲第一区| 成人频在线观看| 欧美国产日韩在线观看| 国产69精品久久久久9999小说| 成人av影视在线| 4k岛国日韩精品**专区| 精品一区av| 丰满少妇高潮一区二区| 亚洲精品一区二区三区香蕉| 五十路在线观看| 久久国产精品影片| 久久综合五月天婷婷伊人| 国产精品麻豆视频| 在线观看国产网站| 久久五月天综合| 国产chinesehd精品露脸| 久久蜜桃av一区二区天堂| 欧美熟女一区二区| 在线观看精品国产视频| 精品国产乱子伦一区二区| 成人一区二区免费视频| 中文av一区二区三区| 日韩一区二区精品在线观看| 久久亚洲资源| 26uuu另类欧美亚洲曰本| 日本一二三四区视频| 黄色精品视频在线观看| 精品人妻无码一区二区色欲产成人|