licode學習之erizo篇 Worker

2022-08-24 18:51:08 字數 2905 閱讀 9899

erizo使用worker來管理task,每個task是乙個函式片段,其執行完全由worker來接管。這次主要學習worker的結構定義和實現機制

1

class 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

void

worker::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函式

void

worker::close()

在close函式中,將變數設為true,並呼叫各種析構。

從start和close的控制可以看到,worker的start和close只能成功呼叫一次,如果close以後,再start,執行緒就會直接退出了。這應該也是乙個小弊端了。

看task函式

void

worker::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,停止定時器

迴圈定時器:

void

worker::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 void

sample_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...