熱線電(dian)話:0755-23712116
郵(you)箱:contact@legoupos.cn
地址:深圳市寶安區沙井街道(dao)后(hou)亭(ting)茅洲山工業(ye)園工業(ye)大廈全至科(ke)技創新園科(ke)創大廈2層2A
首先(xian)還是那個問題,我們為什么(me)需要(yao)多(duo)線程(cheng)(cheng)(cheng)?單線程(cheng)(cheng)(cheng)編程(cheng)(cheng)(cheng)做的(de)好(hao)好(hao)的(de),又(you)簡單又(you)好(hao)用,為什么(me)要(yao)弄(nong)出一個多(duo)線程(cheng)(cheng)(cheng)編程(cheng)(cheng)(cheng)呢(ni)?難道前人是為了設(she)計(ji)而設(she)計(ji)了個多(duo)線程(cheng)(cheng)(cheng)的(de)?顯(xian)然這是不可(ke)能(neng),那么(me)是什么(me)原因呢(ni)?用最精煉的(de)語言(yan)概括無非就是以下兩個原因。
效率和用戶體驗
效(xiao)率主要(yao)(yao)體(ti)(ti)現在服務(wu)端,用(yong)(yong)戶(hu)(hu)體(ti)(ti)驗更多是(shi)體(ti)(ti)現在客(ke)戶(hu)(hu)端,當然(ran)肯定不是(shi)說效(xiao)率只體(ti)(ti)現在服務(wu)端,用(yong)(yong)戶(hu)(hu)體(ti)(ti)驗只體(ti)(ti)現在客(ke)戶(hu)(hu)端,無論是(shi)效(xiao)率還是(shi)用(yong)(yong)戶(hu)(hu)體(ti)(ti)驗在服務(wu)端和客(ke)戶(hu)(hu)端上都會體(ti)(ti)現,只是(shi)說側重點不一樣,這(zhe)一點大家要(yao)(yao)注意(yi)下。
那么多線程(cheng)到底是什么呢?在(zai)(zai)(zai)(zai)計(ji)算(suan)機術語中也可以(yi)叫并發,指的(de)是在(zai)(zai)(zai)(zai)單個(ge)(ge)(ge)(ge)(ge)系統里(li)(li)(li)同時(shi)(shi)執(zhi)(zhi)行多個(ge)(ge)(ge)(ge)(ge)獨立的(de)活(huo)動,而(er)不是順序的(de)一個(ge)(ge)(ge)(ge)(ge)接一個(ge)(ge)(ge)(ge)(ge)的(de)執(zhi)(zhi)行。假設這樣(yang)的(de)一個(ge)(ge)(ge)(ge)(ge)場景,你(ni)(ni)在(zai)(zai)(zai)(zai)一個(ge)(ge)(ge)(ge)(ge)軟(ruan)件(jian)中要導入(ru)(ru)100萬(wan)條(tiao)(tiao)的(de)數(shu)據,如果你(ni)(ni)用單線程(cheng),那么你(ni)(ni)在(zai)(zai)(zai)(zai)導入(ru)(ru)的(de)過程(cheng)中,你(ni)(ni)只能(neng)等(deng)待它導完,其他什么事你(ni)(ni)都做(zuo)不了,因(yin)為軟(ruan)件(jian)會卡在(zai)(zai)(zai)(zai)那里(li)(li)(li),之所以(yi)卡在(zai)(zai)(zai)(zai)那里(li)(li)(li),是因(yin)為軟(ruan)件(jian)里(li)(li)(li)面在(zai)(zai)(zai)(zai)傳輸數(shu)據,而(er)你(ni)(ni)是用單線程(cheng),數(shu)據還沒(mei)傳輸完,下(xia)面的(de)代碼無法(fa)執(zhi)(zhi)行。所以(yi)這個(ge)(ge)(ge)(ge)(ge)時(shi)(shi)候你(ni)(ni)必須用多線程(cheng),開啟(qi)一個(ge)(ge)(ge)(ge)(ge)線程(cheng)來導入(ru)(ru)這100萬(wan)條(tiao)(tiao)數(shu)據,這樣(yang)才(cai)能(neng)保證(zheng)在(zai)(zai)(zai)(zai)導入(ru)(ru)數(shu)據的(de)同時(shi)(shi),你(ni)(ni)還可以(yi)在(zai)(zai)(zai)(zai)軟(ruan)件(jian)上做(zuo)其他操作。
大家要注意一(yi)點(dian),在單核(he)CPU上面,并發并不是真(zhen)正的(de)(de)并發,而是通(tong)過時間片輪詢的(de)(de)方式來(lai)看起來(lai)像是并發,真(zhen)正的(de)(de)并發應該(gai)是在多核(he)CPU上面。
說完了(le)(le)多線(xian)程(cheng)的(de)(de)(de)相(xiang)關概念,我們來說一說多線(xian)程(cheng)編程(cheng)。在(zai)早期C++11之(zhi)前,C++在(zai)語(yu)(yu)言(yan)(yan)級(ji)別上(shang)并(bing)不支持多線(xian)程(cheng),要想實現多線(xian)程(cheng),必(bi)須通(tong)過第(di)三(san)方庫(ku)或者調用平(ping)臺(tai)系(xi)統函數來實現的(de)(de)(de),而不同(tong)平(ping)臺(tai)的(de)(de)(de)多線(xian)程(cheng)的(de)(de)(de)系(xi)統函數又都(dou)不一樣,所以給多線(xian)程(cheng)編程(cheng)帶(dai)來了(le)(le)很多麻煩。但是(shi)從(cong)C++11開(kai)始,C++終(zhong)于開(kai)始在(zai)語(yu)(yu)言(yan)(yan)級(ji)別上(shang)支持多線(xian)程(cheng),我們也終(zhong)于可以用一份代碼(ma)在(zai)多個(ge)平(ping)臺(tai)上(shang)跑了(le)(le)。
那么C++如何實現(xian)線程呢?以下是一個實現(xian)線程的簡單的例子
#include <iostream>
#include <thread>
using namespace std;
void thread_task()
{
cout << "hello thread" << endl;
}
int main()
{
thread t(thread_task);
t.join();
cout << "thread end" << endl;
return 0;
}
thread t(thread_task)這(zhe)個是打開C++多(duo)線程世界的一(yi)個最簡單也是最基礎的一(yi)行代碼,從(cong)此C++開始從(cong)語言級別(bie)上支持了多(duo)線程。
以上是一(yi)個非常(chang)簡單(dan)的C++多線程(cheng)(cheng)的例子(zi),main函數(shu)是主線程(cheng)(cheng),thread_task是子(zi)線程(cheng)(cheng),thread t(thread_task)意思是啟動這個子(zi)線程(cheng)(cheng),join()會使(shi)主線程(cheng)(cheng)會被阻塞,直到(dao)子(zi)線程(cheng)(cheng)執行完畢,然后才退程(cheng)(cheng)序。
所以從這個例(li)子(zi)大家可以看(kan)出C++多(duo)線程(cheng)寫法是多(duo)么的簡潔,讓人充滿的學習的欲望。