我們用網遊來簡單理解一下這幾個概念:
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...