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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3048|回復: 0
收起左側

環形隊列

[復制鏈接]
ID:107189 發表于 2016-3-5 17:41 | 顯示全部樓層 |閱讀模式
環形隊列有一個head指針,有一個tail指針,假設我們用一個環形隊列來表示一組資源,
有一個線程產生資源并往隊列里發送,另外一個線程從隊列里取資源,一般的情況下實現
這樣一個功能需要用到OS的互斥/事件/信號量API,在兩個線程運行都很快時這些OS的API會帶來
比較大的系統開銷,怎么樣盡可能的減少OS的API調用呢,下面是一個簡單的實現方法(假設只有兩個
線程,一個往隊列里寫數據,一個從隊列里讀數據):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 指針的修改不需要保護,應為分別只有一個線程會修改他們,
put線程會讀取tail,修改head, get線程會讀取head, 修改tail。
代碼中最關鍵的是goto語句,防止出現誤等的情況,比如剛開始時,隊列為空,
put線程先運行,該線程會調用increase_semophore語句,然后get線程開始運行,
get線程第一次會取走一個element, 然后get線程繼續運行,當它試圖取第二個element時,
發現隊列為空,于是等待,這時wait_semophore是會成功的,因為put線程之前調用了
increase_semophore,雖然這時get線程會錯誤的等到資源信號量,但它會跳到try_get標簽
處重新檢查隊列是否為空,這樣就避免了出現錯誤的結果。同時經過仔細分析,兩個線程不會死鎖。
這個隊列實現機制的優點是最大的避免了調用OS的互斥/事件/信號量API,僅在必須的時候調用
wait_semophore/increase_semophore API,提高了運行效率。

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕免费 | 成人国产精品视频 | 91亚色视频 | 福利视频网址导航 | 久草精品视频在线看网站免费 | 在线成人小视频 | 国产亚洲精品成人av久久ww | 午夜国产视频 | 四色永久访问 | 精品少妇v888av | 久久艹av| 婷婷狠狠 | 黄色小说视频网站 | 久草精品视频在线看网站免费 | 午夜精品福利视频 | 亚洲激情中文字幕 | 五月天婷婷网站| 在线不卡视频 | 一区二区三区国产视频 | 日韩激情久久 | 成人福利网 | 一区二区不卡视频 | 一级黄色片免费 | 国产精品一区二区三区不卡 | 国产三级在线免费观看 | 日韩久久精品 | 亚洲精品色 | 国产欧美日韩在线视频 | 在线色网| 97香蕉视频| 91丨九色丨国产在线 | 国产色在线 | a级片在线观看 | 天天操综合网 | 欧美顶级黄色大片免费 | 91片黄在线观看 | 国产精品一区二区av | 国产h在线观看 | 亚洲福利一区二区 | 黄色天天影视 | 求av网站|