erizo使用worker來管理task,每個task是乙個函式片段,其執行完全由worker來接管。這次主要學習worker的結構定義和實現機制
1class worker : public std::enable_shared_from_this;
先來研究一下建構函式
worker::worker(std::weak_ptrscheduler, std::shared_ptrthe_clock): scheduler_, //構造定時器變數
clock_,//構造自己的時鐘變數
service_{}, //構造io_service物件
service_worker_, //為io_service注入service_worker,避免直接退出
closed_
在建構函式中,使用boost io service,構建了基本的執行緒架構。
研究一下start
voidworker::start()
void worker::start(std::shared_ptrvoid>>start_promise)
return size_t(0
); };
group_.add_thread(
newboost::thread(worker)); //實際建立執行緒,並將之新增到group裡面
}
提供了兩個start函式,無參的直接建立乙個promise,呼叫有引數的,並且並未使用get_future.wait進行流程控制。
看一下close函式
voidworker::close()
在close函式中,將變數設為true,並呼叫各種析構。
從start和close的控制可以看到,worker的start和close只能成功呼叫一次,如果close以後,再start,執行緒就會直接退出了。這應該也是乙個小弊端了。
看task函式
voidworker::task(task f)
task呼叫io service的post,直接投遞任務。也就是說task實際上就是乙個基礎的處理,讓任務進行投遞然後執行。
std::shared_ptrworker::schedulefromnow(task f, duration delta)}f();
}));
}), delta_ms);
} return
id;}
在schedulefromnow裡面,呼叫了scheduler的schedulefromnow方法,在scheduler裡面,進入定時執行緒,到達時間後,執行worker的task方法,投遞乙個task,進而啟用worker,執行task內容,完成定時執行操作。
停止定時器:
void worker::unschedule(std::shared_ptrid)
設定cancel,停止定時器
迴圈定時器:
voidworker::scheduleevery(scheduledtask f, duration period)
void
worker::scheduleevery(scheduledtask f, duration period, duration next_delay)
}), std::max(next_delay, duration));
}
迴圈定時器,使用遞迴呼叫,來實現迴圈定時器,其停止依託於scheduledtask的返回值為false,停止迴圈。
總結:worker提供了基本的執行緒管理,提供了task執行機制以及定時器控制機制,但是沒有提供資源重複使用的機制,即多次呼叫close,start的機制
使用例子:
#include voidsample_worker_task()
); index++;
worker_no_promise->task([index] );
//worker_no_promise->close();
//worker_no_promise->reset();
std::shared_ptr
worker_with_promise = std::make_shared(schedule);
std::promise pro = std::make_sharedvoid>>();
worker_with_promise->start(pro);
pro.get_future().wait();
//wait util the thread is ok
index++;
worker_with_promise->task([index] );
index++;
worker_with_promise->task([index] );
//worker_with_promise->close();
//worker_with_promise->reset();
//schedule->reset();
}void
sample_woker_schedule_task()
, 10000
); worker_with_promise->scheduleevery([index, clk]
return
false
; },
3000
); //worker_with_promise->close();
//worker_with_promise->reset();
//schedule->reset();
}
licode學習之erizo篇 IOWorker
erizo使用ioworker進行ice,dtls的狀態互動處理。標頭檔案1 class ioworker public std enable shared from this 介面定義與worker基本沒有區別,但是內部使用了atomic變數,而沒有使用boost的io service,說明執行緒...
Groovy學習之資料篇
groovy 官方 大部分問題看這裡的文件都可以搞定了,從入門到精通在這裡都可以完成。pleac groovy 大量的 示例,是perl cookbook的乙個groovy版本 groovy tutorial 非常好的乙個介紹groovy的ppt,可以快速的對groovy有乙個總體的了解,可以看作是...
shell學習之awk篇
網上關於awk的部落格說的也是夠多的了,之所以再寫有兩點原因 1 大部分博文說的不夠全面 2 作為自己系統學習shell的乙個記載。0.以下示例說明均以此資料作為依據,檔名為countries ussr 8649 275 asia canada 3852 25 north america china...