亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Linux Shell > 正文

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

2020-07-27 19:20:46
字體:
供稿:網(wǎng)友

設(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:
    list<T> _list;
    pthread_mutex_t _lock;
};

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

template <typename T>
T Queue<T>::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:
    list<T> _list;
    pthread_mutex_t _rlock, _wlock;
};


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

template <typename T>
T Queue<T>::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:
    list<T> _list;
    pthread_mutex_t _lock;
    pthread_mutexattr_t _attr;
    pthread_cond_t _cond;
};

template <typename T>
T BlockingQueue<T>::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ù)了。例如,新聞頻道的自動收報(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 久久一区二区三区四区| 国产美女精品视频免费观看| 蜜桃免费在线| 欧美激情在线狂野欧美精品| 国产精品美女久久久浪潮软件| 国产九九精品| 人人妻人人藻人人爽欧美一区| 亚洲91中文字幕无线码三区| 在线观看免费中文字幕| 麻豆成人在线| 色噜噜久久综合| 欧美日韩中文字幕视频| 一级视频在线免费观看| 日韩在线中文字幕视频| 91亚洲国产成人久久精品网站| 国产精品美女高潮无套| 午夜激情在线播放| 成人精品福利视频| 激情久久综合| 国产成人精品免费看视频| 日韩欧美在线观看视频| 免费日韩电影| 日韩高清av电影| 午夜在线视频免费观看| 337p日本欧洲亚洲大胆精品| 日本sm残虐另类| a级大片免费看| 91福利区在线观看| 日本污视频在线观看| 久久影视电视剧免费网站| 51妺嘿嘿午夜福利| 波多野结衣在线播放| 天天爱天天干天天操| 久久的色偷偷| 欧美色成人综合| 在线免费看黄网站| 蘑菇福利视频一区播放| 欧洲成人一区| 精品视频在线观看| 久久久久久久久91| 精品美女www爽爽爽视频| 色戒汤唯在线观看| 久久久久亚洲av成人毛片韩| 91精品啪aⅴ在线观看国产| 欧美精品一区二区三区高清aⅴ| 亚洲免费在线播放| 亚洲国产欧美日韩在线| 波多野结衣乳巨码无在线观看| 国产精品高潮呻吟久久久久| 国产精品亚洲片在线播放| 婷婷在线视频观看| 国产小视频在线播放| 在线看的黄色网址| 99久久自偷自偷国产精品不卡| 一区二区三区四区在线观看视频| 免费激情视频网站| 天天做夜夜做人人爱精品| 亚洲精品乱码久久久久久9色| 自拍在线观看| 91精品短视频| 在线播放高清视频www| 星空影院最新电视剧免费观看| 中文字幕第66页| 亚洲高清成人影院| 久久久久一区二区三区| 日韩国产精品亚洲а∨天堂免| 日本天堂一区| 极品尤物av丝袜美腿在线观看| 亚洲午夜久久久影院| 亚洲成人免费网站| 国产精品国产精品88| 欧美xingq一区二区| 亚洲欧美在线第一页| 亚洲电影成人成人影院| www.日韩.com| 你懂的网址国产 欧美| 欧美精选午夜久久久乱码6080| 国产在线一区视频| 欧美电影免费观看高清| 黄色另类av| 国产美女精品视频| 91大神在线播放精品| 九义人在线观看完整免费版电视剧| 久久美女高清视频| 久久天天躁狠狠躁夜夜躁| 欧美专区在线| 91精品久久久久久久久久久久| 日本a在线天堂| 日韩成人av免费| 日本在线观看网址| 欧美aaaxxxx做受视频| 800av在线免费观看| 久久精品人人做人人爽97| 黄色av网址在线| 欧美多人野外伦交| 亚洲免费视频二区| 欧美经典三级视频一区二区三区| 在线免费看黄网站| 伊人狠狠色丁香综合尤物| 午夜影院在线免费观看| 欧美乱大交做爰xxxⅹ小说| 色综合一区二区日本韩国亚洲| 精品亚洲一区二区三区在线播放| 亚洲国产成人综合| 青青草97国产精品免费观看无弹窗版| 国产精品你懂的在线欣赏| 51成人做爰www免费看网站| 日韩欧美成人午夜| 久久综合av免费| 亚洲卡通欧美制服中文| 亚洲成av人片在线观看无码| 国产精品露出视频| 日韩成人黄色| 国产精品视频黄色| 亚洲日本乱码在线观看| 韩国视频一区二区| 成人乱人伦精品视频在线观看| 涩涩涩999| 欧美一级国产精品| 人妻在线日韩免费视频| xxxxxx欧美| 在线成人视屏| 亚洲人成电影在线观看网| 一级黄色免费视频| 99视频精品免费视频| 国产女片a归国片aa| 日韩在线国产精品| 17婷婷久久www| 欧美三区免费完整视频在线观看| 久久男人天堂| 一二三四区视频| 国产午夜精品麻豆| 先锋a资源在线看亚洲| 亚洲视频一二三区| 一区二区高清免费观看影视大全| 欧美va天堂va视频va在线| 大香一本蕉伊线亚洲网| 欧美一区二区麻豆红桃视频| ...中文天堂在线一区| 黄色精品视频网站| 欧美一级淫片aaaaaa| 国产精品原创视频| 国产69精品久久app免费版| 51精品在线| eeuss影院www| 亚洲h片在线看| 亚洲成人精品在线观看| 国产成人亚洲精品自产在线| 欧美黄色大片在线观看| 日韩aaa久久蜜桃av| 日日摸夜夜夜夜夜添| 92福利视频午夜1000合集在线观看| 国产专区欧美专区| 中文字幕日韩免费视频| 亚洲欧美精品在线观看| 亚洲精品免费在线观看视频| 欧美国产日韩在线观看| 成人无遮挡免费网站视频在线观看| 乱中年女人伦av一区二区| 欧美 变态 另类 人妖| 成年女人午夜毛片免费看| 欧美一级视频免费在线观看| 天天在线视频色| 久久久久久久久99| 久久国产视频播放| 国模娜娜一区二区三区| 中文字幕在线视频一区| 亚洲精品一区二区三区四区五区| 7777精品伊人久久久大香线蕉最新版| 99视频在线精品国自产拍免费观看| 日韩三级免费看| 麻豆一二三区精品蜜桃| 亚洲精品日韩在线观看| 最新版天堂资源在线| 国产福利一区二区三区视频| 久久久999国产| 免费网站在线观看人| 欧美午夜视频在线观看| 911国产在线| 成年人福利视频| 37pao成人国产永久免费视频| 亚洲一区二区自拍偷拍| 国产在线小视频| 日韩一卡二卡在线观看| 九九热99久久久国产盗摄| 国产极品视频在线观看| 久久久久久久久久久久久久久久久久| 免费毛片大全| 久久久久久久久爱| 黄色电影网站在线观看| www.狠狠插| 影音先锋男人看片资源| 亚洲女人天堂网| 私库av在线播放| 亚洲爆乳无码一区二区三区| 亚洲国产综合久久| 日本在线视频网址| xxxxaaa欧美另类| 色哟哟免费视频| 国产一区二区三区av在线| 中文字幕日产av| 日韩精品视频免费| 香蕉一区二区| 亚洲男女视频在线观看| 成人免费直播live| 成人黄色在线看| 日韩美女视频中文字幕| 日韩欧洲国产| 搞黄在线观看| 美女一区网站| 狠狠做深爱婷婷综合一区| 精品国产一区二区三| 国产老女人av| 成人1区2区| 小视频在线播放| 欧美日韩麻豆| 99久久精品久久久久久清纯| 国产大尺度视频| 玉足女爽爽91| 最好看更新中文字幕| 中文字幕无乱码| 国产一区在线观| 国产精品入口夜色视频大尺度| 在线免费黄网| 黄www在线观看| 俄罗斯毛片基地| 77777少妇光屁股久久一区| 亚洲成人高清| www.av麻豆| 欧美视频一区二| 国产黄网站在线观看| 国产精品欧美一区二区| 国产成人手机高清在线观看网站| 男人操女人在线观看| 国产suv精品一区二区33| 国产人妖一区二区三区| 极品尤物久久久av免费看| 国产中年熟女高潮大集合| 男女污污的视频| 午夜影院韩国伦理在线| 国产成人a级片| 成人永久在线| 久久亚洲美女| 88国产精品视频一区二区三区| 国产一区二区三区四区五区加勒比| 欧美24videosex性欧美| 亚洲一区色图| 精品一区中文字幕| 综合久久成人| 免费一级欧美片在线观看网站| 亚洲精品日韩一| 少妇伦子伦精品无吗| 手机在线电影一区| 成人激情免费在线| 欧美xxxx老人做受| 成年人免费视频观看| 国产亚洲第一的欧洲日产| 中文字幕一区免费| 久久全球大尺度高清视频| 黄色录像免费观看| 日本中文字幕电影在线观看| 欧美少妇性性性| 生活片a∨在线观看| 免费人成黄页在线观看忧物| 日韩中文字幕av电影| 精品视频一区三区九区| 亚洲高清视频免费观看| 一本久道中文无码字幕av| 国产深夜男女无套内射| 91日韩免费| 国产精品18久久久久久vr| 亚洲精品一区二区三区四区高清| 久久99热在线观看7| 91欧美日韩在线| 中文字幕一区二区三中文字幕| 日韩日韩日韩日韩| 日本亚洲不卡| 国产亚洲一级高清| 成人97人人超碰人人99| 国产小视频在线看| 99日在线视频| 日韩黄色动漫| 精品国产乱码久久久久久蜜臀网站| 亚洲综合在线视频| 欧美日韩成人在线一区| 亚洲激情 欧美| 午夜在线免费观看视频| 九九精品免费视频| 波多野结衣中文字幕久久| 欧美日韩在线精品一区二区三区激情| 国产午夜精品无码| 蜜臀99久久精品久久久久小说| www日本视频| 777米奇影视第四色| 国产69久久精品成人看| 日韩有码视频在线| 中文字幕1区2区| 国产精品入口福利| 日本黄色免费在线| 亚洲综合不卡| 欧美日韩精品久久久| 中文字幕亚洲一区二区三区| 日韩在线免费视频观看| 国产精品毛片无遮挡高清| 亚洲色图在线播放| 一代武则天秘史| 久久福利影院| 欧美日韩亚洲一区二区三区在线观看| 国产麻豆日韩| 自拍偷拍亚洲综合| 免费在线看黄色| 8090成年在线看片午夜| 日韩欧美亚洲v片| 色婷婷综合久久久中文字幕| 午夜小视频在线| 综合国产在线视频| 日韩精品1区2区| 影音先锋在线中文字幕| 国产精品一区二区三| 91日韩精品视频| 一本到不卡免费一区二区| 国产精品密蕾丝视频下载| 国产精品久久久久天堂| 丁香激情五月婷婷| 伊人青青综合网站| 黄色精品视频在线观看| 精品国产乱子伦一区| 不卡在线观看av|