日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

srs代码学习(2)- 线程模型

發(fā)布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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??
  • ??
  • ??/*?Adjust?stack?size?*/??
  • ??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;??
  • ??
  • ??/*?Allocate?thread?object?and?per-thread?data?off?the?stack?*/??
  • #if?defined?(MD_STACK_GROWS_DOWN)??
  • ??sp?=?stack->stk_top;??
  • #ifdef?__ia64__??
  • ??/*?
  • ???*?The?stack?segment?is?split?in?the?middle.?The?upper?half?is?used?
  • ???*?as?backing?store?for?the?register?stack?which?grows?upward.?
  • ???*?The?lower?half?is?used?for?the?traditional?memory?stack?which?
  • ???*?grows?downward.?Both?stacks?start?in?the?middle?and?grow?outward?
  • ???*?from?each?other.?
  • ???*/??
  • ??sp?-=?(stk_size?>>?1);??
  • ??bsp?=?sp;??
  • ??/*?Make?register?stack?64-byte?aligned?*/??
  • ??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;??
  • ??
  • ??/*?Make?stack?64-byte?aligned?*/??
  • ??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?*));??
  • ??
  • ??/*?Make?stack?64-byte?aligned?*/??
  • ??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?*));??
  • ??
  • ??/*?Initialize?thread?*/??
  • ??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?thread?is?joinable,?allocate?a?termination?condition?variable?*/??
  • ??if?(joinable)?{??
  • ????thread->term?=?st_cond_new();??
  • ????if?(thread->term?==?NULL)?{??
  • ??????_st_stack_free(thread->stack);??
  • ??????return?NULL;??
  • ????}??
  • ??}??
  • ??
  • ??/*?Make?thread?runnable?*/??
  • ??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)容還不錯,歡迎將生活随笔推薦給好友。