生活随笔
收集整理的這篇文章主要介紹了
srs代码学习(2)- 线程模型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼閱讀到現(xiàn)在。發(fā)現(xiàn)srs有兩大類線程。一個是主線程的邏輯。
一個是監(jiān)聽線程簇。結(jié)構(gòu)圖如下
一定還有第三種線程模型,負責底層的多路分發(fā)。今天還沒有發(fā)現(xiàn)。
2016.08.25--21:00
仔細閱讀了state-threads的介紹,特別是setjmp()和longjmp()函數(shù),發(fā)現(xiàn)了一下代碼
[cpp]?view plaincopy
_st_thread_t?*st_thread_create(void?*(*start)(void?*arg),?void?*arg,?? ???????????????????int?joinable,?int?stk_size)?? {?? ??_st_thread_t?*thread;?? ??_st_stack_t?*stack;?? ??void?**ptds;?? ??char?*sp;?? #ifdef?__ia64__?? ??char?*bsp;?? #endif?? ?? ???? ??if?(stk_size?==?0)?? ????stk_size?=?ST_DEFAULT_STACK_SIZE;?? ??stk_size?=?((stk_size?+?_ST_PAGE_SIZE?-?1)?/?_ST_PAGE_SIZE)?*?_ST_PAGE_SIZE;?? ??stack?=?_st_stack_new(stk_size);?? ??if?(!stack)?? ????return?NULL;?? ?? ???? #if?defined?(MD_STACK_GROWS_DOWN)?? ??sp?=?stack->stk_top;?? #ifdef?__ia64__?? ??? ? ? ? ? ? ?? ??sp?-=?(stk_size?>>?1);?? ??bsp?=?sp;?? ???? ??if?((unsigned?long)bsp?&?0x3f)?? ????bsp?=?bsp?+?(0x40?-?((unsigned?long)bsp?&?0x3f));?? ??stack->bsp?=?bsp?+?_ST_STACK_PAD_SIZE;?? #endif?? ??sp?=?sp?-?(ST_KEYS_MAX?*?sizeof(void?*));?? ??ptds?=?(void?**)?sp;?? ??sp?=?sp?-?sizeof(_st_thread_t);?? ??thread?=?(_st_thread_t?*)?sp;?? ?? ???? ??if?((unsigned?long)sp?&?0x3f)?? ????sp?=?sp?-?((unsigned?long)sp?&?0x3f);?? ??stack->sp?=?sp?-?_ST_STACK_PAD_SIZE;?? #elif?defined?(MD_STACK_GROWS_UP)?? ??sp?=?stack->stk_bottom;?? ??thread?=?(_st_thread_t?*)?sp;?? ??sp?=?sp?+?sizeof(_st_thread_t);?? ??ptds?=?(void?**)?sp;?? ??sp?=?sp?+?(ST_KEYS_MAX?*?sizeof(void?*));?? ?? ???? ??if?((unsigned?long)sp?&?0x3f)?? ????sp?=?sp?+?(0x40?-?((unsigned?long)sp?&?0x3f));?? ??stack->sp?=?sp?+?_ST_STACK_PAD_SIZE;?? #else?? #error?Unknown?OS?? #endif?? ?? ??memset(thread,?0,?sizeof(_st_thread_t));?? ??memset(ptds,?0,?ST_KEYS_MAX?*?sizeof(void?*));?? ?? ???? ??thread->private_data?=?ptds;?? ??thread->stack?=?stack;?? ??thread->start?=?start;?? ??thread->arg?=?arg;?? ?? #ifndef?__ia64__?? ??_ST_INIT_CONTEXT(thread,?stack->sp,?_st_thread_main);?? #else?? ??_ST_INIT_CONTEXT(thread,?stack->sp,?stack->bsp,?_st_thread_main);?? #endif?? ?? ???? ??if?(joinable)?{?? ????thread->term?=?st_cond_new();?? ????if?(thread->term?==?NULL)?{?? ??????_st_stack_free(thread->stack);?? ??????return?NULL;?? ????}?? ??}?? ?? ???? ??thread->state?=?_ST_ST_RUNNABLE;?? ??_st_active_count++;?? ??_ST_ADD_RUNQ(thread);?? #ifdef?DEBUG?? ??_ST_ADD_THREADQ(thread);?? #endif?? ?? ??return?thread;?? }??
這個是創(chuàng)建線程的函數(shù)。仔細搜索其中的thread變量,會發(fā)現(xiàn)其實本身并沒有創(chuàng)建一個新的線程,額只是在堆上分配了一個新的stack.代碼如下
thread = (_st_thread_t *) sp;
這個thread只是一個結(jié)構(gòu)體。
這么說來,整個程序都是在一個主線程上做調(diào)用。而不存在線程的切換。一系列同步鎖等問題。這一點還有在以后代碼閱讀中在做體會。
雖然大概搞明白了,但這里面的理念包括代碼,已經(jīng)超越我的認知了。這怎么可能呢?
2016-08-26 15:00
發(fā)現(xiàn)了一個新的線程簇,用了做rtmp協(xié)議的收發(fā),結(jié)構(gòu)圖如下
分析過好,發(fā)現(xiàn)這個類線程簇是在上一類線程的基礎(chǔ)上。增加了rtmpser模塊接收或者發(fā)送數(shù)據(jù),由于有了消息的概念所以多了幾個新的類,包括SrsCommonMessage類,
這個類的是rtmp消息專用類,雖然在名字中沒有體現(xiàn)出來。
總結(jié)
以上是生活随笔為你收集整理的srs代码学习(2)- 线程模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。