當收到一次呼叫的時候,fs
會在tu
層建立兩個執行緒,乙個執行緒為狀態機執行緒,另外乙個為訊息執行緒。狀態機執行緒通過switch_core_session_thread_launch建立,顧名思義其作用是不斷的檢查channel的狀態,並進行處理。以下為詳細處理過程。
狀態機的執行機制:
2個**函式
分別為:
const switch_state_handler_table_t *driver_state_handler = null;
下面為具體的**分析:
fs裡面有大量的結構體,其變數的型別為函式指標。然後定義此結構,直接使用全域性函式名稱進行初始化。達到**的效果。
例:結構體
struct switch_state_handler_table while(...)
狀態機的**過程,下圖:
概括為:
1、根據狀態機的狀態執行mod_sofia
中對應的**函式
和core
設定的對應的**函式
3、如果狀態沒有發生改變根據狀態機的狀態執行對應的standard
函式l 狀態機狀態一覽
typedef enum switch_channel_state_t;
以上為呼叫過程中的所有狀態機。其中標註藍色的狀態會根據當前狀態執行狀態機函式。
修改channel
狀態當channel
的狀態發生改變,進行修改時,會進行喚醒動作,把之前進入
sleep
的session
執行緒喚醒。然後從新執行狀態機。
另外乙個執行緒為訊息執行緒,其功能為不斷的從呼叫對應的訊息佇列裡面取出訊息,並進行處理,我在session
文件裡面有過描述,會建立乙個訊息佇列。
訊息的處理會在訊息佇列裡面進行描述。這裡不再訊息講述。
Lua的執行緒和狀態
那不是真的多執行緒 lua不支援真正的多執行緒,這句話我在 lua中的協同程式 這篇文章中就已經說了。根據我的程式設計經驗,在開發過程中,如果可以避免使用執行緒,那就堅決不用執行緒,如果實在沒有更好的辦法,那就只能退而用之。為什麼?首先,多個執行緒之間的通訊比較麻煩,同時,執行緒之間共享記憶體,對於...
6 執行緒的狀態和名字
import threading 執行緒名字 class mythread threading.thread def run self if name main t mythread name downloadthread t.start 2.執行緒的執行順序 import time class m...
執行緒的宣告週期和狀態
新建 new 新建立乙個執行緒 就緒 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start方法,該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權 執行 running 就緒狀態的執行緒或者cpu 的使用權,執行程式 阻塞 blocked 阻塞狀態是執行緒因為某...