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

首頁 > 開發 > Linux Shell > 正文

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

2020-07-27 19:20:46
字體:
來源:轉載
供稿:網友

設計并發隊列

復制代碼 代碼如下:

#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;
}

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

復制代碼 代碼如下:

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;
}

設計并發阻塞隊列

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

復制代碼 代碼如下:

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);
}

并發阻塞隊列設計有兩個要注意的方面:

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

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

設計有超時限制的并發阻塞隊列

在許多系統中,如果無法在特定的時間段內處理新數據,就根本不處理數據了。例如,新聞頻道的自動收報機顯示來自金融交易所的實時股票行情,它每 n 秒收到一次新數據。如果在 n 秒內無法處理以前的一些數據,就應該丟棄這些數據并顯示最新的信息。根據這個概念,我們來看看如何給并發隊列的添加和取出操作增加超時限制。這意味著,如果系統無法在指定的時間限制內執行添加和取出操作,就應該根本不執行操作。

復制代碼 代碼如下:

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 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品av在线播放| 中文字幕精品影院| 亚洲缚视频在线观看| 午夜精品一区二区三区在线视频| 欧美成人免费大片| 91欧美视频网站| 少妇精69xxtheporn| 欧美交受高潮1| 亚洲国产日韩欧美在线99| 欧美日韩亚洲网| 亚洲欧美成人精品| 美女视频黄免费的亚洲男人天堂| 国产精品网站入口| 一本色道久久综合狠狠躁篇怎么玩| 欧美在线不卡区| 亚洲图片欧美午夜| 高清欧美一区二区三区| 91精品国产高清| 欧美黄色成人网| 日韩一区二区欧美| 久久久午夜视频| 亚洲最大福利网站| 欧美日韩中文在线观看| 亚洲综合一区二区不卡| 久久777国产线看观看精品| 日日摸夜夜添一区| 国产精品一二三在线| 欧美亚洲午夜视频在线观看| 日韩av大片免费看| 欧美成人精品在线视频| 国产精品免费久久久久久| 一道本无吗dⅴd在线播放一区| 国产精品视频地址| 国产香蕉一区二区三区在线视频| 国产一区在线播放| 亚洲xxxx妇黄裸体| 日本a级片电影一区二区| 久久69精品久久久久久国产越南| 亚洲一区中文字幕| 九九九热精品免费视频观看网站| 青草青草久热精品视频在线网站| 国模精品视频一区二区| 欧美黑人xxx| 国产精品久久久亚洲| 国产精品视频在线播放| 国产精品久久久久久久午夜| 久久成人一区二区| 久久久精品影院| 国内免费精品永久在线视频| 亚洲一区亚洲二区| 日韩精品视频三区| 欧美理论电影在线观看| 26uuu国产精品视频| 5252色成人免费视频| 亚洲毛茸茸少妇高潮呻吟| 日产精品99久久久久久| 久久影院中文字幕| 欧美一区二三区| 亚洲视频综合网| 亚洲国产精品va在线看黑人| 国产精品视频公开费视频| 国产精品欧美一区二区三区奶水| 91免费欧美精品| 国产精品国模在线| 国产精品久久久久久影视| 欧美大全免费观看电视剧大泉洋| 国产一区二区视频在线观看| 日韩精品视频在线免费观看| 在线色欧美三级视频| 亚洲女在线观看| 全亚洲最色的网站在线观看| 97在线视频精品| 久久视频免费在线播放| 川上优av一区二区线观看| 久久久久免费精品国产| 欧美一级免费看| 亚洲影院色在线观看免费| 亚洲男人av在线| 久久露脸国产精品| 最新国产精品拍自在线播放| 久久在精品线影院精品国产| 欧美性猛交xxxxx水多| 色综合天天综合网国产成人网| 日韩中文字幕免费视频| 国产精欧美一区二区三区| 另类图片亚洲另类| 欧美成人免费网| 亚洲影视九九影院在线观看| 一区二区三区 在线观看视| 69av视频在线播放| 国产日韩中文字幕| 国产精品视频在线观看| 97香蕉超级碰碰久久免费软件| 亚洲精品美女久久| 中国日韩欧美久久久久久久久| 国产成人+综合亚洲+天堂| 4438全国亚洲精品在线观看视频| 欧美精品久久久久a| 亚洲午夜国产成人av电影男同| 亚洲天堂色网站| 日韩高清电影好看的电视剧电影| 亚洲女人被黑人巨大进入| 国产一区二区在线免费视频| 91久久中文字幕| 亚洲一区二区三区四区在线播放| 国产女人18毛片水18精品| 成人午夜激情免费视频| 超碰精品一区二区三区乱码| 国产91在线高潮白浆在线观看| 色爱精品视频一区| 综合欧美国产视频二区| 亚洲电影天堂av| 91精品免费久久久久久久久| 日韩在线观看成人| 欧美在线播放视频| 日韩av网址在线| 国内精品伊人久久| 欧美精品久久久久久久免费观看| 国产成人精品网站| 国产成人自拍视频在线观看| 国产91成人video| 成人免费淫片aa视频免费| 日韩欧美国产一区二区| 欧美成人h版在线观看| 欧美激情视频在线观看| 亚洲欧美日韩国产精品| 亚洲精品www| 91沈先生在线观看| 疯狂欧美牲乱大交777| 国产美女主播一区| 亚洲视频在线免费观看| 北条麻妃一区二区三区中文字幕| 在线精品视频视频中文字幕| 欧美高清视频在线播放| 久青草国产97香蕉在线视频| 精品中文字幕乱| 亚洲已满18点击进入在线看片| 午夜免费久久久久| 欧美性少妇18aaaa视频| 国产99久久精品一区二区| 中文国产亚洲喷潮| 欧美精品xxx| 欧美国产日韩在线| 18性欧美xxxⅹ性满足| 日韩在线免费观看视频| 久久久久www| 日本亚洲欧洲色α| 欧美一级高清免费| 日本韩国欧美精品大片卡二| 久久国产精品99国产精| 欧美日韩第一页| 精品久久香蕉国产线看观看亚洲| 欧美午夜精品久久久久久人妖| 久久黄色av网站| 欧美成人自拍视频| 欧洲永久精品大片ww免费漫画| 国产精品成人免费电影| 精品调教chinesegay| 欧美视频第一页| 久久91超碰青草是什么| 亚洲va电影大全| 欧美日韩成人在线视频| 色综合天天狠天天透天天伊人| 久久久亚洲精选|