指定線程運行任務(wù)

使用場景

使用某些第三方庫時,會遇到線程安全的問題.
如OpenGL是非線程安全的 對OpenGL API的調(diào)用需要在同一個線程中完成.

實現(xiàn)原理

假定runOnAssignThread這個API 可以把任務(wù)投遞到指定線程運行

假設(shè)有多個線程 一個指定的任務(wù)運行線程 其余都是業(yè)務(wù)線程
在業(yè)務(wù)線程的運行過程中 將會調(diào)用到runOnAssignThread
就將任務(wù)投遞到了任務(wù)線程運行 業(yè)務(wù)線程不真正運行這個任務(wù)

偽代碼實現(xiàn):
任務(wù)運行函數(shù):
void runOnAssignThread(task task) {
    if (當前就處于任務(wù)線程) {
        task();//直接執(zhí)行任務(wù)
    } else {
        //把任務(wù)插入到一個隊列中
    }
}

相應(yīng)的 在任務(wù)線程中 需要不斷的處理隊列中的任務(wù)
任務(wù)線程中:
for (;;) {
    if (隊列有任務(wù)) {
        task = list.front();//取出任務(wù)
        task();//運行任務(wù)
    }
}

大致的運行原理如此 實際上還有多線程對任務(wù)隊列的訪問同步稍计、任務(wù)線程的啟動和退出條件這些細節(jié)需要考慮

Object-C實現(xiàn)

iOS的GCD編程封裝了底層的線程操作
dispatch_sync可以直接指定在某個diapatch_queue_t中同步運行任務(wù)
這使得iOS的runOnAssignThread的實現(xiàn)容易了很多
dispatch_queue_t assignQueue; //此處假設(shè)這個隊列已經(jīng)申請好了

void runOnAssignQueue (void (^task)(void)) {
    if (dispatch_get_current_queu() == assignQueue) {
        task();
    } else {
        dispatch_sync(assignQueue, task);
    }
}

C++ 實現(xiàn)

#include "runOnVideoQueue.hpp"
#include <iostream>
#include <thread>
#include <list>
#include <mutex>
#include <condition_variable>

typedef std::function<void()> task;
std::list<task> taskList;
std::mutex taskMutex;
std::condition_variable taskCond;
std::__thread_id videoQueueThreadID;
bool endFlag = false;

void runOnVideoQueue(task task) {
    if (std::this_thread::get_id() == videoQueueThreadID) {
        task();
    } else {
        std::unique_lock<std::mutex> lock(taskMutex);
        taskList.push_back(task);
        
        endFlag = true;
        taskCond.notify_one();
    }
}

void handleEventOnVideoQueue() {
    for (;;) {
        task task = nullptr;
        {
            std::unique_lock<std::mutex> lock(taskMutex);
            taskCond.wait(lock, [] {
                return endFlag;
            });
            
            if (taskList.empty()) {
                std::cout << "error:empty task list";
                continue;
            }
            
            task = taskList.front();
            taskList.pop_front();
            endFlag = false;
        }
        
        task();
    }
}

void runOnVideoQueueTest() {
    videoQueueThreadID = std::this_thread::get_id();
    std::cout << "video queue thread id:" << videoQueueThreadID << std::endl;
    
    std::thread otherQueue([] {
        runOnVideoQueue([](){
            std::cout << "add on other Queue but run on video queu biu biu biu" << std::endl;
        });
    });
    otherQueue.join();
    
    runOnVideoQueue([](){
        std::cout << "run on video queu biu biu biu" << std::endl;
    });
    
    handleEventOnVideoQueue();
}

各個平臺上的實現(xiàn)原理基本是一致的 因為語言或者平臺特點有些許差別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末至非,一起剝皮案震驚了整個濱河市闯捎,隨后出現(xiàn)的幾起案子泰涂,更是在濱河造成了極大的恐慌,老刑警劉巖膜廊,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙已,死亡現(xiàn)場離奇詭異,居然都是意外死亡袜茧,警方通過查閱死者的電腦和手機菜拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛厦,“玉大人纳鼎,你說我怎么就攤上這事∩淹梗” “怎么了贱鄙?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姨谷。 經(jīng)常有香客問我逗宁,道長,這世上最難降的妖魔是什么梦湘? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任瞎颗,我火速辦了婚禮,結(jié)果婚禮上捌议,老公的妹妹穿的比我還像新娘哼拔。我一直安慰自己,他們只是感情好禁灼,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布管挟。 她就那樣靜靜地躺著,像睡著了一般弄捕。 火紅的嫁衣襯著肌膚如雪僻孝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天守谓,我揣著相機與錄音穿铆,去河邊找鬼。 笑死斋荞,一個胖子當著我的面吹牛荞雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凤优,長吁一口氣:“原來是場噩夢啊……” “哼悦陋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筑辨,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤俺驶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棍辕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暮现,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年楚昭,在試婚紗的時候發(fā)現(xiàn)自己被綠了栖袋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抚太,死狀恐怖塘幅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尿贫,我是刑警寧澤晌块,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站帅霜,受9級特大地震影響匆背,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身冀,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一钝尸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搂根,春花似錦珍促、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仁卷,卻和暖如春穴翩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锦积。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工芒帕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丰介。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓背蟆,卻偏偏與公主長得像鉴分,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子带膀,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評論 25 707
  • 1志珍、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • 淚凝于睫離情苦,妙手擦眼欲遮掩垛叨。 世間最大苦是于碴裙,莫過離別相聚難。 此去前方茫茫路点额,何時歸期待論時。 遠去...
    酒一一閱讀 185評論 0 2
  • 讀鳳紅邪的自卑等系列文章有感 最近一直頭腦風暴珍手,猛喝雞湯,打雞血〈亲觯現(xiàn)...
    半日閑brx閱讀 927評論 0 6