快速理解Linux多執行緒及Epoll

2021-07-02 04:12:27 字數 1756 閱讀 2569

我們用網遊來簡單理解一下這幾個概念:

1. 多執行緒

比如我們要下個副本,自己乙個人單力孤(主線程),推不過去怎麼辦?

最實在的方法,組滿人,一起下副本,大家在乙個程序(推副本)中互相合作,多個隊員就是多執行緒。

比如我是法師,只管輸出;隊員中有牧師,只管加血(輸入);mt做mt的事......

也有可能我們隊伍都是弓手,那麼void * func (void *arg)就是可以用相同的函式;

只要把第四個引數(人物id號)傳過來就ok了。

說epoll還得先說下阻塞,listen(),read()都是阻塞的。

這個概念在遊戲中十分常見,比如說刀劍中的搶箱子,箱子大概5分鐘出現乙個,拿齊4個箱子才能繼續後面回報豐厚的任務

於是一群人等在出箱子的地方,你也等在那裡,在沒有搶夠箱子之前,你什麼其它事都不能做(因為走遠了來不急回去),這就是阻塞。

當然,你可以雙開,乙個等箱子,另乙個去推副本,那麼這就變成了多執行緒;

再好的機器,也不能實現過多的開啟,比如說十開,在電腦或網速不高的情況下,甚至雙開都無法實現;而相對於linux伺服器來說,也不能支援過多的執行緒,如何利用有限的資源呢? 於是我們又有了select和epoll

簡單的說,就是等箱子那個號先原地下線,上小號做任務,等時間快到了退小號,上原號搶箱子

在這裡,玩遊戲的人實現了epoll

的功能(在出現阻塞時,先去做別的事情)

——————————————

//epoll就像是航母的主控室,一架飛機掛了(阻塞),排程另外的飛機繼續任務,而不要無限的等待

//相當於在乙個執行緒裡實現多執行緒的功能,所需要的就是給每個飛機乙個對講機,你有情況了就報告一下,主控室好根據訊息調控~

intepfd=epoll_create(100);// 主控室只需要建造一次

setnonblocking(listen_st); // 設定成非阻塞狀態(我們不使用多執行緒,那麼在等待時程式就不動了)

//(比如說一架飛機出去執行任務,掛了,大家死等它回來.....)

epoll_ctl(epfd,epoll_ctl_add, ***, &ev); // 主控室控制,加入需要進行控制的裝置,

//比如說伺服器,比如說多個飛機(客戶端)

epoll_ctl(epfd,epoll_ctl_add, ***, &ev);  //這個會執行多次

while(1) //由主控室來死迴圈

int nfds =epoll_wait(epfd,events,100,-1);  // 主控室實時監控,收到當前時刻的(有效)訊息數量,

//每條訊息都對應相應的裝置號或飛機編號

for(i = 0; i < nfds; i++) //每個重要訊息都乙個乙個處理 {

if(events[i].data.fd == listen_st) ... // 伺服器訊息(例如有客戶端連線上來了)

if(events[i].events & epollin) ....// 偵察機發來訊息

if(events[i].events & epollerr)... //偵察機故障

if(events[i].events & epollhup)...//偵察機被摧毀}

close(epfd); //程式結束前,關閉主控室

多執行緒 理解多執行緒(一)

程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...

多執行緒理解

本文介紹我對於多執行緒的理解。一 概念 1.作業系統下的多程序場景 但其實上面的情景是屬於作業系統下的多程序,不是單個程式內的多程序,這種多程序跟我們在單個程式內的多執行緒沒有什麼可以比較的。2.執行緒 舉個最簡單例子 我們的任務需要兩個計算型操作 a b 每個操作耗時10秒,如果是單執行緒,這時我...

多執行緒理解

單核cpu 單執行緒與多執行緒 執行時都是併發操作 a.執行條件 無io等操作,時間大小 多執行緒 單執行緒,原因 多執行緒執行時執行緒切換耗時間 b.執行條件 有io等操作,時間大小 單執行緒 多執行緒,原因 單執行緒要等待io的操作時間,從而加長時間 單核多執行緒的作用 在b中展現出優點。多核c...