久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3038|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

環(huán)形隊(duì)列

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-5 17:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
環(huán)形隊(duì)列有一個(gè)head指針,有一個(gè)tail指針,假設(shè)我們用一個(gè)環(huán)形隊(duì)列來表示一組資源,
有一個(gè)線程產(chǎn)生資源并往隊(duì)列里發(fā)送,另外一個(gè)線程從隊(duì)列里取資源,一般的情況下實(shí)現(xiàn)
這樣一個(gè)功能需要用到OS的互斥/事件/信號(hào)量API,在兩個(gè)線程運(yùn)行都很快時(shí)這些OS的API會(huì)帶來
比較大的系統(tǒng)開銷,怎么樣盡可能的減少OS的API調(diào)用呢,下面是一個(gè)簡單的實(shí)現(xiàn)方法(假設(shè)只有兩個(gè)
線程,一個(gè)往隊(duì)列里寫數(shù)據(jù),一個(gè)從隊(duì)列里讀數(shù)據(jù)):volatile u32 head = tail = 0;
os_semophore sem;
bool init()
{
    sem.max_val = 1;
    sem.init_val   = 0;
    return true;
}
void put()
{
    bool need_wait = need_wake_putter = false;   
    while (1) {
try_put:
        need_wait = need_wake_putter = false;
        if (tail == ((head + 1) % len)  //full
            need_wait = true;
        else if (tail == head)   //empty
            need_wake_getter = true;
            
        if (need_wait) {
            wait_semophore(sem);
            goto try_put;
        } else {
            put_element;
            head = (head + 1) % len;
            if (need_wake_getter)
                increase_semophore(sem);
        }
    }
}
void get()
{
    bool need_wait = need_wake_putter = false;   
    while (1) {
try_get:
        need_wait = need_wake_putter = false;
        if (head == tail) //empty
            need_wait = true;
        else if (tail == ((head + 1) % len)  //full
            need_wake_putter =true;
            
        if (need_wait) {
            wait_semophore(sem);
            goto try_get;
        } else {
            get_element;
            tail = (tail + 1) % len;
            if (need_wake_putter)
                increase_semophore(sem);
        }
    }
}
head 與 tail 指針的修改不需要保護(hù),應(yīng)為分別只有一個(gè)線程會(huì)修改他們,
put線程會(huì)讀取tail,修改head, get線程會(huì)讀取head, 修改tail。
代碼中最關(guān)鍵的是goto語句,防止出現(xiàn)誤等的情況,比如剛開始時(shí),隊(duì)列為空,
put線程先運(yùn)行,該線程會(huì)調(diào)用increase_semophore語句,然后get線程開始運(yùn)行,
get線程第一次會(huì)取走一個(gè)element, 然后get線程繼續(xù)運(yùn)行,當(dāng)它試圖取第二個(gè)element時(shí),
發(fā)現(xiàn)隊(duì)列為空,于是等待,這時(shí)wait_semophore是會(huì)成功的,因?yàn)閜ut線程之前調(diào)用了
increase_semophore,雖然這時(shí)get線程會(huì)錯(cuò)誤的等到資源信號(hào)量,但它會(huì)跳到try_get標(biāo)簽
處重新檢查隊(duì)列是否為空,這樣就避免了出現(xiàn)錯(cuò)誤的結(jié)果。同時(shí)經(jīng)過仔細(xì)分析,兩個(gè)線程不會(huì)死鎖。
這個(gè)隊(duì)列實(shí)現(xiàn)機(jī)制的優(yōu)點(diǎn)是最大的避免了調(diào)用OS的互斥/事件/信號(hào)量API,僅在必須的時(shí)候調(diào)用
wait_semophore/increase_semophore API,提高了運(yùn)行效率。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91动漫在线观看 | 中文字幕第一页在线 | 国产精品伦一区二区三级视频 | 亚洲精品成人网 | 最新日韩在线视频 | 一级黄色影片在线观看 | 亚洲成人动漫在线观看 | 亚洲精品视频免费观看 | 日韩综合一区 | 夜夜精品浪潮av一区二区三区 | 日本不卡一区 | 亚洲巨乳自拍在线视频 | 婷婷色国产偷v国产偷v小说 | 男女下面一进一出网站 | 免费影视在线观看 | 欧美中文字幕在线观看 | 国产黄视频在线播放 | 99视频在线| 天天综合网天天综合 | 综合久久久久 | 91色视频在线观看 | 国产一区免费 | 国产精品一区二 | 久久久久亚洲精品 | 国产三级 | 国产清纯白嫩初高生在线播放视频 | 成人欧美一区二区三区色青冈 | 国产精品免费视频一区 | 午夜看片网站 | 久久狠狠 | 懂色中文一区二区三区在线视频 | 亚洲欧美日韩精品 | 欧一区二区 | 欧洲一级视频 | h视频免费在线观看 | 日韩精品成人在线 | 色综合久久久久 | 欧美精品91| 狠狠av | 日韩中文一区二区 | 天堂一区 |